【问题标题】:How to Retrieve the most recent Identity value and use it in an INSERT statement in SQLServer/Azure?如何检索最新的标识值并将其用于 SQLServer/Azure 中的 INSERT 语句?
【发布时间】:2013-03-17 03:31:54
【问题描述】:

[编辑]

根据 Mitch Wheat 的建议,插入现在可以与 (SCOPE_IDENTITY(), 'Semi-Fail')(@@IDENTITY, 'Semi-Fail') 一起使用; 然而,两者都会在选择时产生NULL 值:

create clustered index test2_inx ON test2 (test1_id);

以下INSERTs 都产生NULL

INSERT INTO test1 VALUES ('Semi-failure');
INSERT INTO test2 VALUES (SCOPE_IDENTITY(), 'Semi-failure');
INSERT INTO test1 VALUES ('Semi-failure');
INSERT INTO test2 VALUES (@@IDENTITY, 'Semi-failure');
SELECT * FROM test2;

IDENT_CURRENT 的使用确实有效,但是:

INSERT INTO test1 VALUES ('Success');
INSERT INTO test2 VALUES (IDENT_CURRENT('test1'), 'Success');

...但是为什么我不能让它与其他两个一起使用?

谢谢。

顺便说一句:来自 Oracle,表可以被创建为堆表以外的任何东西而不被指定为这样的概念,嗯,是疯狂的。那是云的事吗?有人知道这样做的目的吗?

[/编辑]

DDL:

CREATE TABLE test1 (
 id int identity(1,1)
,value varchar(20)
,CONSTRAINT test1_id_pk PRIMARY KEY (id)
);
CREATE TABLE test2 (
 id int
,value varchar(20)
,CONSTRAINT test2_id_fk FOREIGN KEY (id) REFERENCES test1 (id)
)

插入 test1 语句:

INSERT INTO test1 VALUES ('failure');

以下所有操作都失败并出现相同的错误:

INSERT INTO test2 VALUES (SCOPE_IDENTITY(), 'fail');
INSERT INTO test2 VALUES (select SCOPE_IDENTITY(), 'fail');
INSERT INTO test2 VALUES ( (select SCOPE_IDENTITY()) , 'fail');
INSERT INTO test2 VALUES (@@IDENTITY, 'fail');
INSERT INTO test2 VALUES (select @@IDENTITY, 'fail');
INSERT INTO test2 VALUES ( (select @@IDENTITY), 'fail');
INSERT INTO test2 VALUES (IDENT_CURRENT('test1'), 'fail');
INSERT INTO test2 VALUES (select IDENT_CURRENT('test1'), 'fail');
INSERT INTO test2 VALUES ( (select IDENT_CURRENT('test1'), 'fail');

对于上述每个INSERT 语句,我收到以下错误之一:

Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again.
Incorrect syntax near the keyword 'select'.

此外,以下选择语句返回 null,在 INSERT 进入 test1 之后:

SELECT SCOPE_IDENTITY();
SELECT @@IDENTITY;

而以下返回正确的值:

SELECT IDENT_CURRENT('test1');

【问题讨论】:

  • 可能是一个愚蠢的问题,但您使用相同的连接来选择 SCOPE_IDENTITY(),而不是让它在中间关闭,不是吗?

标签: sql-server azure azure-sql-database identity-column sql-insert


【解决方案1】:

必须在您的表上定义一个聚集索引(如您发布的错误消息中所述)。

因为 Microsoft Windows Azure SQL 数据库不支持堆 表,表必须有聚集索引。如果创建了表 没有聚集约束,必须创建聚集索引 在允许对表进行插入操作之前。

Ref.

这样做,然后SELECT SCOPE_IDENTITY() 应该可以工作。

【讨论】:

  • 谢谢@Mitch Wheat。我进行了更改,但无法从 SCOPE_IDENTITY 获取值。您可以参考我的编辑吗?
  • 我建议你问一个单独的问题而不是回答这个问题。
  • 我的问题是如何从 Azure 中的 Identity 列中插入最近生成的值。感谢您提供有关创建聚集索引的提示,因为 Azure 与常规 SQLServer 不同,但我使用 SCOPE_IDENTITY 正在检索 NULL value,因此我的问题仍然存在。
  • 感谢您对聚集索引的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
相关资源
最近更新 更多