代码之家  ›  专栏  ›  技术社区  ›  pn.

当@@IDENTITY不返回空值时,SCOPE\u IDENTITY如何返回空值?

  •  17
  • pn.  · 技术社区  · 15 年前

    在执行insert之后,我选择 SCOPE_IDENTITY @@IDENTITY .

    范围标识 返回空值,但 @@身份

    我不明白这怎么可能。

    4 回复  |  直到 12 年前
        1
  •  19
  •   KM.    15 年前

    下面是一个示例,说明SCOPE\u IDENTITY()将为空,但@@IDENTITY将有一个值:

    该表有一个insert触发器 身份。作用域标识()将是 空(本地作用域中没有标识), 但是@@IDENTITY将报告 来自触发器的标识。

    https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811

    使用IDENTITY的最佳方法是使用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
    
        2
  •  16
  •   marc_s    15 年前

    公里击中了头部:

    • @@IDENTITY 为您提供插入的最后一个标识值—无论它是在哪一个表中插入的(请考虑 触发器 ,例如进入审计表!甚至是一连串的触发器……)

    • SCOPE_IDENTITY()

        3
  •  8
  •   JulesB    9 年前

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

        4
  •  3
  •   Dustin Laine    15 年前

    我在MSDN上找到这个:

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

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

    您的SQL代码将非常有用。