2012-12-12 12 views
0

我在msdn上研究了以下行。@@ IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT之間的區別

@@IDENTITYSCOPE_IDENTITY將在當前會話中返回的任何表生成的最後一個標識值。

然而,SCOPE_IDENTITY只在當前範圍內返回值。

@@IDENTITY並不限於特定的範圍「

所以我的問題是」什麼是current sessioncurrent scope「在上面的行。

在此先感謝。

+2

相關:http://stackoverflow.com/questions/42648/best-way-to-get-identity-of-inserted-row – Oded

+4

在MSDN頁面上的例子看起來很清楚:http://msdn.microsoft。 com/en-us/library/ms190315.aspx - 你不明白什麼? – Oded

+0

@Oded沒有達到您在評論中鏈接的頁面。順便說一句,謝謝。 –

回答

1

如果你想回到你剛插入的值(用來插入到子表) ,那麼一般你需要使用scope_identity()。這是特定於您的連接所運行的聲明的範圍。它不會給你任何人的身份價值。

@@ identiy,也是特定於您的範圍,但它也包括範圍中的觸發器值,因此如果表中有一個也插入到標識的觸發器,即返回的標識。因此,這意味着@@身份不應用於返回您插入的值,因爲只要有人添加觸發器,它就會開始返回worng值。

然後是ident_current。這是最危險的一種,因爲無論使用哪種方式,它都會回退最後一個表的標識。因此,如果您使用它來獲取標識值,則需要注意與連接記錄無關放入並使用它來獲取用於插入子表的身份是數據完整性問題的保證。

較新版本的SQL服務器有一個OUTPUT子句,這比使用上述三項中的任何一項都優越得多,因爲您可以返回一組身份和其他字段的值。

+0

清除current_scope的概念。但我仍然不瞭解current_session。究竟是什麼? –

+0

每次應用程序連接到SQL Server時,都會創建一個新的會話。所以如果每個用戶都有100個登錄進行工作,每個用戶都在自己的會話中。這就是爲什麼ident_current如此危險,它並不侷限於你特意做的工作,而是可以跨越界限並帶回其他人插入的身份。 – HLGEM

+0

謝謝...... :) –

-2

@@其範圍IDENTITY限於當前的會話 但SCOPE_IDENTITY()擁有跨越服務器的所有會話範圍

+0

-1'SCOPE_IDENTITY'的範圍比'@@ IDENTITY'更有限。 –

+0

@MartinSmith究竟什麼是當前會話和當前範圍?我堅持這個概念。 –

+0

@CodeRider - 兩者之間的區別在於'@@ IDENTITY'還將包括在子範圍中生成的'IDENTITY'值,例如存儲過程調用或觸發器中的代碼,這些觸發器響應當前範圍的操作而被觸發。 'SCOPE_IDENTITY'只受同級別的語句影響。 –