gpt4 book ai didi

sql-server - 如何检索最新的 Identity 值并在 SQLServer/Azure 中的 INSERT 语句中使用它?

转载 作者:行者123 更新时间:2023-12-03 03:19:11 25 4
gpt4 key购买 nike

[编辑]

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

create clustered index test2_inx ON test2 (test1_id);

以下INSERT都产生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'.

此外,以下 select 语句在 INSERT 到 test1 后返回 null:

SELECT SCOPE_IDENTITY();
SELECT @@IDENTITY;

而以下返回正确的值:

SELECT IDENT_CURRENT('test1');

最佳答案

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

Because Microsoft Windows Azure SQL Database does not support heap tables, a table must have a clustered index. If a table is created without a clustered constraint, a clustered index must be created before an insert operation is allowed on the table.

Ref .

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

关于sql-server - 如何检索最新的 Identity 值并在 SQLServer/Azure 中的 INSERT 语句中使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15457219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com