2011-09-04 205 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