對有insert觸發器表取IDENTITY值時發現的問題

來源:互聯網
上載者:User

問題是這樣的:
T1表上有一個INSERT的觸發器,在插入資料的時候,會自動往T2表裡面插一條記錄
這樣當我在T1表上插入新的資料時,取@@IDENTITY的時候,返回的id值是T2表裡面的新記錄的值

趕快查了下msdn,原來@@IDENTITY還有這麼多講究:

在一條 INSERT、SELECT INTO 或大量複製陳述式完成後,@@IDENTITY 中包含語句產生的最後一個標識值。如果語句未影響任何包含識別欄位的表,則 @@IDENTITY 返回 NULL。如果插入了多個行,產生了多個標識值,則 @@IDENTITY 將返回最後產生的標識值。如果語句觸發了一個或多個觸發器,該觸發器又執行了產生標識值的插入操作,那麼,在語句執行後立即調用 @@IDENTITY 將返回觸發器產生的最後一個標識值。如果對包含識別欄位的表執行插入操作後觸發了觸發器,並且觸發器對另一個沒有識別欄位的表執行了插入操作,則 @@IDENTITY 將返回第一次插入的標識值。出現 INSERT 或 SELECT INTO 語句失敗或大量複製失敗,或者事務被復原的情況時,@@IDENTITY 值不會恢複為以前的設定。

如果語句和事務失敗,它們會更改表的當前標識,從而使識別欄位中的值出現不連貫現象。即使未提交試圖向表中插入值的事務,也永遠無法復原標識值。例如,如果因 IGNORE_DUP_KEY 衝突而導致 INSERT 語句失敗,表的當前標識值仍然會增加。
@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 是相似的函數,因為他們都返回插入到表的 IDENTITY 列的最後一個值。
@@IDENTITY 和 SCOPE_IDENTITY 可以返回當前會話中的所有表中產生的最後一個標識值。但是,SCOPE_IDENTITY 只在當前範圍內傳回值,而 @@IDENTITY 不限於特定的範圍。
IDENT_CURRENT 不受範圍和會話的限制,而受限於指定的表。IDENT_CURRENT 可以返回任何會話和任何範圍中為特定表產生的標識值。
@@IDENTITY 函數的範圍是執行該函數的本機伺服器上的當前會話。此函數不能應用於遠程或連結的伺服器。若要獲得其他伺服器上的標識值,請在遠程伺服器或連結的伺服器上執行預存程序,並使(在遠程或連結的伺服器的環境中執行的)該預存程序收集標識值,並將其返回本機伺服器上的發出調用的串連。

所以對多個表進行操作的時候,最好用
SELECT SCOPE_IDENTITY()和SELECT IDENT_CURRENT(‘T1')方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.