2011-09-04 207 views
4

我有存储过程,采取@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() 
+0

只是为什么我低估了你的问题的一个说明。从下面的评论看来,你在提供答案后编辑了你的问题,使答案看起来很混乱。不知道如何做某件事情并不令人羞耻。公开你的学习过程,以便其他人可以从中学习。就像现在一样,有这个问题的其他人现在不能使用你的经验来学习。 –

+0

@本,我不同意你的看法。 “......不知道...的耻辱......”与此无关。我解释了为什么我在回答马丁时编辑我的文章。我错误地在这里写错了他们的顺序。在我的代码中(在家中),我按正确的顺序写了它们。我请你请upvote我的问题请 – theateist

回答

12

像俄德说,问题是你问的身份,你执行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内。

+1

问题是不同的范围不是操作的顺序。执行插入的'sp_executesql'在执行'SCOPE_IDENTITY()'调用之前执行(编辑:我看到OP已经编辑他们的问题,现在让你的第一行显示错误+1) –

+0

@Martin,我错误地按错误的顺序写了它们。在我的代码中,我按正确的顺序写了它们。无论如何,我编辑了我的帖子 – theateist

+0

@Andomar,我编辑了我的代码。为什么我需要将SCOPE_IDENTITY插入@sql?为什么我不能在sp_executesql之后调用它? – theateist