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

pn.*_*pn. 19 sql-server sql-server-2005

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

SCOPE_IDENTITY返回null但@@IDENTITY不返回null .

我不明白这是怎么可能的.

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

KM.*_*KM. 18

这是SCOPE_IDENTITY()将如何为null但@@ IDENTITY将具有值的一个示例:

插入到没有标识的表中,该表具有插入触发器,然后插入具有标识的历史记录表.SCOPE_IDENTITY()将为null(本地范围内没有标识),但@@ IDENTITY将报告触发器的标识.

仅供参考,SCOPE_IDENTITY()存在已知错误:https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?反馈ID = 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
Run Code Online (Sandbox Code Playgroud)

  • @Aaronaught,OP不提供INSERT代码,它可能是使用并行性的INSERT-SELECT.为什么我甚至打赌这有1%的可能性!;-)至少在我的回答中,我提出了两种不同的方式,@@ Identity和SCOPE_IDENTITY()可以有不同的值,而不仅仅是它们的BOL定义. (2认同)

mar*_*c_s 15

KM击中头部:

  • @@IDENTITY给你插入的最后一个IDENTITY值 - 无论它在哪个表中插入(想想触发器,例如进入审计表!甚至是一连串的触发器......)

  • SCOPE_IDENTITY() 为您提供在语句范围内插入的最后一个IDENTITY,例如在您自己的实际语句引用的表上(不是那些可能被触发器触及的表)


小智 6

当插入是sp_executesql时,SCOPE_IDENTITY也将返回NULL,因为您不再在INSERT的范围内!


Dus*_*ine 3

我在 MSDN 上找到了这个:

如果在作用域中发生对标识列的任何 INSERT 语句之前调用该函数,则 SCOPE_IDENTITY() 函数将返回 null 值。

您可以在这里阅读:http://msdn.microsoft.com/en-us/library/ms190315.aspx

您的 SQL 代码将会非常有帮助。