为什么SCOPE_IDENTITY返回NULL?
问题描述:
我有存储过程,采取@dbName
并在该数据库中插入记录。 我想获取最后插入的记录的ID。 SCOPE_IDENTITY()
返回NULL并且@@IDENTITY
返回正确的ID,为什么会发生?在我阅读时,如果桌面上有触发器,最好使用SCOPE_IDENTITY()
。 我可以使用IDENT_CURRENT
吗?无论触发器是否它都会返回表格范围内的ID?为什么SCOPE_IDENTITY返回NULL?
那么这是什么问题和使用什么?
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()
答
像俄德说,问题是你问的身份,你执行insert
之前。
作为解决方案,最好尽可能靠近insert
运行scope_identity
。通过使用sp_executesql
与输出参数,可以作为动态SQL语句的一部分运行scope_identity
:
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
内。
只是为什么我低估了你的问题的一个说明。从下面的评论看来,你在提供答案后编辑了你的问题,使答案看起来很混乱。不知道如何做某件事情并不令人羞耻。公开你的学习过程,以便其他人可以从中学习。就像现在一样,有这个问题的其他人现在不能使用你的经验来学习。 –
@本,我不同意你的看法。 “......不知道...的耻辱......”与此无关。我解释了为什么我在回答马丁时编辑我的文章。我错误地在这里写错了他们的顺序。在我的代码中(在家中),我按正确的顺序写了它们。我请你请upvote我的问题请 – theateist