当@@ IDENTITY没有时,SCOPE_IDENTITY如何返回null?

时间:2010-03-05 19:24:01

标签: sql-server sql-server-2005

执行插入后,我选择SCOPE_IDENTITY@@IDENTITY

SCOPE_IDENTITY返回null,但@@IDENTITY没有。

我不明白这是怎么回事。

你能想到出现这种情况的原因吗?

4 个答案:

答案 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)

KM击中了头上的钉子:

  • @@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代码非常有用。

相关问题