我有一个存储过程,它采用@dbName
并在该数据库中插入记录。
我想获取最后插入的记录的ID。 SCOPE_IDENTITY()
返回 NULL 而 @@IDENTITY
返回正确的 id,为什么会发生这种情况?正如我所读到的,所以最好使用 SCOPE_IDENTITY() 以防表上有一些触发器。
我可以使用 IDENT_CURRENT
吗?无论触发器如何,它都会返回表范围内的 id 吗?
那么问题是什么以及使用什么?
已编辑
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()
最佳答案
就像 Oded 所说,问题在于您在执行插入
之前询问身份。
作为解决方案,最好尽可能靠近 insert
运行 scope_identity
。通过使用带有输出参数的 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
内。
关于sql - 为什么 SCOPE_IDENTITY 返回 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7298030/