我的存储过程采用@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()
答案 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
内。