sql - what - 獲取插入行身份的最佳方法?




what is the function of sql server (7)

插入行的IDENTITY的最佳方式是什麼?

我知道@@IDENTITYIDENT_CURRENTSCOPE_IDENTITY但不了解每個人的優缺點。

有人能解釋一下這些差異,以及我應該什麼時候使用它們?


MSDN

@@ IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT是類似的函數,它們返回插入到表的IDENTITY列中的最後一個值。

@@ IDENTITY和SCOPE_IDENTITY將返回當前會話中任何表中生成的最後一個標識值。 但是,SCOPE_IDENTITY僅在當前範圍內返回值; @@ IDENTITY不限於特定範圍。

IDENT_CURRENT不受範圍和會話的限制; 它僅限於指定的表格。 IDENT_CURRENT返回為任何會話和任何範圍中的特定表生成的標識值。 有關更多信息,請參閱IDENT_CURRENT。

  • IDENT_CURRENT是一個以表格作為參數的函數。
  • 在桌面上有觸發器時, MSDN可能會返回混淆結果
  • SCOPE_IDENTITY大部分時間都是你的英雄。

@@ IDENTITY是使用當前SQL連接插入的最後一個標識。 從插入存儲過程返回這是一個很好的價值,在這裡你只需要為新記錄插入標識,而不必關心後面是否添加了更多行。

SCOPE_IDENTITY是使用當前SQL連接插入的最後一個標識,並且在當前作用域中 - 也就是說,如果在插入後基於觸發器插入了第二個IDENTITY,它將不會反映在SCOPE_IDENTITY中,只有您執行的插入。 坦率地說,我從來沒有理由使用它。

IDENT_CURRENT(表名)是插入的最後一個標識,無論連接或範圍如何。 如果你想為沒有插入記錄的表獲取當前的IDENTITY值,你可以使用它。


SELECT CAST(scope_identity() AS int);

然後到你的插入sql語句的末尾

NewId = command.ExecuteScalar()

將檢索它。


在你的插入語句之後,你需要添加這個。 並確保數據插入的表名。您將獲得當前行號,其中行受到插入語句的影響。

IDENT_CURRENT('tableName')

我說的和其他人一樣,所以每個人都是對的,我只是想說清楚。

@@IDENTITY返回客戶端連接到數據庫的最後一個事件的ID。
大多數時候這工作正常,但有時觸發器會插入一個你不知道的新行,並且你會從這個新行獲得ID,而不是你想要的

SCOPE_IDENTITY()解決了這個問題。 它返回發送到數據庫的SQL代碼中插入的最後一個內容的ID。 如果觸發器去創建額外的行,它們不會導致返回錯誤的值。 萬歲

IDENT_CURRENT返回任何人插入的最後一個ID。 如果其他應用恰好在不幸的時間插入另一行,您將獲得該行的ID而不是您的ID。

如果您想安全玩,請始終使用SCOPE_IDENTITY() 。 如果你堅持使用@@IDENTITY並且稍後有人決定添加一個觸發器,那麼你的所有代碼都會中斷。


獲取新插入行的身份的最佳(讀取:最安全)方法是使用output子句:

create table TableWithIdentity
           ( IdentityColumnName int identity(1, 1) not null primary key,
             ... )

-- type of this table's column must match the type of the
-- identity column of the table you'll be inserting into
declare @IdentityOutput table ( ID int )

insert TableWithIdentity
     ( ... )
output inserted.IdentityColumnName into @IdentityOutput
values
     ( ... )

select @IdentityValue = (select ID from @IdentityOutput)

  • @@IDENTITY在所有範圍內返回當前會話中任何表生成的最後一個標識值。 你需要小心 ,因為它跨越了示波器。 您可以從觸發器中獲取值,而不是當前的語句。

  • SCOPE_IDENTITY()返回為當前會話中的任何表和當前範圍生成的最後一個標識值。 一般你想用什麼

  • IDENT_CURRENT('tableName')返回為任何會話和任何範圍中的特定表生成的最後一個標識值。 這可以讓你指定你想從哪個表中獲得值,以防上述兩者不是你所需要的( 非常少見 )。 另外,正如@ Guy Starbuck所說:“如果你想為沒有插入記錄的表獲取當前IDENTITY值,你可以使用它。”

  • INSERT語句的OUTPUT子句可讓您訪問通過該語句插入的每一行。 由於它是針對特定語句的範圍,因此比上述其他函數更直接 。 但是,它有點冗長 (你需要插入到表變量/臨時表中,然後查詢),並且即使在語句被回滾的錯誤情況下它也會給出結果。 也就是說,如果您的查詢使用並行執行計劃,這是獲取身份的唯一保證方法 (不能關閉並行性)。 但是,它觸發器之前執行不能用於返回觸發器生成的值。





tsql