为什么SCOPE_IDENTITY返回NULL?

时间:2011-09-04 08:05:47

标签: sql sql-server tsql

我的存储过程采用@dbName并在该数据库中插入记录。 我想获取最后插入记录的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()

1 个答案:

答案 0 :(得分: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

以下example at SE Data显示scope_identity应位于sp_executesql内。