2010-03-05 77 views
15

執行插入後,我選擇SCOPE_IDENTITY@@IDENTITY@@ IDENTITY沒有時SCOPE_IDENTITY如何返回null?

SCOPE_IDENTITY返回null,但@@IDENTITY沒有。

我不明白這是如何可能的。

你能想到這種情況發生的原因嗎?

+3

您能否提供更多詳情......例如顯示調用SCOPE_IDENTITY()的代碼,並解釋任何其他變量(例如是否包含觸發器?)。 – 2010-03-05 19:26:14

回答

1

,我發現這個MSDN上:

的SCOPE_IDENTITY()函數將返回空值如果函數之前的任何INSERT語句調入標識列發生在範圍之內。

你可以在這裏閱讀:http://msdn.microsoft.com/en-us/library/ms190315.aspx

你的SQL代碼將是非常有益的。

15

這裏是SCOPE_IDENTITY()如何將是空的,但@@ IDENTITY將有一個值的一個例子:

插入表沒有身份, 該表具有插入觸發器 然後插入成爲一個具有 身份的歷史表。 SCOPE_IDENTITY()將爲 null(本地範圍內無身份), ,但@@ IDENTITY將從觸發器報告 身份。

僅供參考,有一個與SCOPE_IDENTITY()一個已知的bug:https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811

與身份最好的辦法是使用OUTPUT INTO,它可以捕捉一個集ID,並且不受SCOPE_IDENTITY() BUG:

declare @x table (tableID int identity not null primary key, datavalue varchar(10)) 
declare @y table (tableID int, datavalue varchar(10)) 

INSERT INTO @x values ('aaaa') 
INSERT INTO @x values ('bbbb') 
INSERT INTO @x values ('cccc') 
INSERT INTO @x values ('dddd') 
INSERT INTO @x values ('eeee') 


INSERT INTO @x 
    (datavalue) 
    OUTPUT INSERTED.tableID, INSERTED.datavalue  --<<<<OUTPUT INTO SYNTAX 
    INTO @y           --<<<<OUTPUT INTO SYNTAX 
SELECT 
    'value='+CONVERT(varchar(5),dt.NewValue) 
    FROM (SELECT id as NewValue from sysobjects where id<20) dt 
    ORDER BY dt.NewValue 


select * from @x 
select * from @y 
+0

雖然這是事實,但我不認爲有必要深入探討一個不明確的錯誤,這些錯誤只有在插入多行並嘗試檢索單個標識時纔會顯現出來。 SCOPE_IDENTITY()在99%的情況下沒有問題。同樣,這一切都是正確的,但對於仍然在學習'@@ IDENTITY'和'SCOPE_IDENTITY()'之間區別的人來說,這可能有點令人難以置信。 – Aaronaught 2010-03-05 20:14:01

+2

@Aononaught,OP不提供INSERT代碼,它可能是使用並行性的INSERT-SELECT。爲什麼我甚至打賭說有1%的機會! ;-)至少在我的回答中,我提出了兩種不同的方式:@@ Identity和SCOPE_IDENTITY()可以具有不同的值,而不僅僅是它們的BOL定義。 – 2010-03-08 13:42:30

11

KM擊中了要害:

  • @@IDENTITY爲您提供插入的最後一個IDENTITY值 - 無論它插入哪個表中的哪個位置(請考慮觸發器,例如,納入審計表!或者甚至是級聯的觸發器.....)

  • SCOPE_IDENTITY()爲您提供了插入語句範圍的最後一個IDENTITY,例如,在(可能已經感動觸發不是那些)表(S)是你自己的,實際的語句引用

+1

當使用並行時,SCOPE_IDENTITY()無法返回正確的結果:https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811 – 2010-03-05 19:47:24

+1

我喜歡這個答案,最好的 - 特定的和重點。 – Aaronaught 2010-03-05 20:15:30

+0

這個答案是如何回答這個問題的?將scope_identity保持在範圍內的解決方案是什麼?這是他問題的真正第二個問題。 – PositiveGuy 2012-05-25 15:14:18

5

SCOPE_IDENTITY也將返回NULL當插入是sp_executesql的,你是不是在較長INSERT的範圍!