执行插入后,我选择SCOPE_IDENTITY
或@@IDENTITY
。
SCOPE_IDENTITY
返回null,但@@IDENTITY
没有。
我不明白这是怎么回事。
你能想到出现这种情况的原因吗?
答案 0 :(得分:17)
这里是SCOPE_IDENTITY()如何为null但@@ IDENTITY将具有值的一个示例:
插入没有身份的表格, 该表有一个插入触发器 然后插入到历史表中 身份。 SCOPE_IDENTITY()将是 null(本地范围内没有标识), 但是@@ IDENTITY会报告 来自触发器的身份。
仅供参考,SCOPE_IDENTITY()存在已知错误:https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811
身份最好的选择是使用OUTPUT INTO,它可以捕获一组ID并且不受SCOPE_IDENTITY()错误的影响:
declare @x table (tableID int identity not null primary key, datavalue varchar(10))
declare @y table (tableID int, datavalue varchar(10))
INSERT INTO @x values ('aaaa')
INSERT INTO @x values ('bbbb')
INSERT INTO @x values ('cccc')
INSERT INTO @x values ('dddd')
INSERT INTO @x values ('eeee')
INSERT INTO @x
(datavalue)
OUTPUT INSERTED.tableID, INSERTED.datavalue --<<<<OUTPUT INTO SYNTAX
INTO @y --<<<<OUTPUT INTO SYNTAX
SELECT
'value='+CONVERT(varchar(5),dt.NewValue)
FROM (SELECT id as NewValue from sysobjects where id<20) dt
ORDER BY dt.NewValue
select * from @x
select * from @y
答案 1 :(得分:14)
@@IDENTITY
为您提供插入的最后一个IDENTITY值 - 无论在哪个表中插入它(想想触发,例如进入审计表!甚至是一连串的触发器.....)
SCOPE_IDENTITY()
为您提供在语句范围内插入的最后一个IDENTITY,例如在您自己的实际陈述引用的表格上(不是触发器可能触及的那些)
答案 2 :(得分:5)
当插入是sp_executesql时,SCOPE_IDENTITY也将返回NULL,因为您不再属于INSERT的范围!
答案 3 :(得分:2)
我在MSDN上发现了这个:
如果在对作用域中的任何INSERT语句进入标识列之前调用该函数,则SCOPE_IDENTITY()函数将返回null值。
您可以在此处阅读:http://msdn.microsoft.com/en-us/library/ms190315.aspx
您的SQL代码非常有用。