为什么SCOPE_IDENTITY返回NULL?

the*_*ist 4 sql t-sql sql-server

我有存储过程,@dbName在该DB 中获取并插入记录.我想获取最后插入记录的id.SCOPE_IDENTITY()返回NULL并@@IDENTITY返回正确的id,为什么会发生?正如我所读到的,所以最好SCOPE_IDENTITY()在桌面上有一些触发器的情况下使用.我可以用IDENT_CURRENT吗?无论触发器是什么,它是否返回表范围内的id?

那么问题是什么以及使用什么?

EDITED

DECALRE @dbName nvarchar(50) = 'Site'
DECLARE @newId int
DECLARE @sql nvarchar(max)
SET @sql = N'INSERT INTO ' + quotename(@dbName) + N'..myTbl(IsDefault) ' +
           N'VALUES(0)'     
EXEC sp_executesql @sql

SET @newId = SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)

And*_*mar 12

就像Oded所说,问题是你在执行之前要求身份insert.

作为解决方案,最好scope_identity尽可能接近尽可能地运行insert.通过使用sp_executesql输出参数,您可以scope_identity作为动态SQL语句的一部分运行:

SET @sql = N'INSERT INTO ' + quotename(@dbName) + N'..myTbl(IsDefault) ' +
           N'VALUES(0) ' +
           N'SET @newId = SCOPE_IDENTITY()'
EXEC sp_executesql @sql, N'@newId int output', @newId output
Run Code Online (Sandbox Code Playgroud)

这是SE数据的一个例子,显示scope_identity应该在里面sp_executesql.

  • @theateist:`sp_executesql`中的代码在不同的"范围"中运行.(不要试图使用`@@ identity`;它可能会解决这个问题,但它会留给你一大堆其他人.) (3认同)