對(duì)有insert觸發(fā)器表取IDENTITY值時(shí)發(fā)現(xiàn)的問(wèn)題
更新時(shí)間:2009年06月05日 23:51:07 作者:
趕快查了下msdn,原來(lái)@@IDENTITY還有這么多講究
問(wèn)題是這樣的:
T1表上有一個(gè)INSERT的觸發(fā)器,在插入數(shù)據(jù)的時(shí)候,會(huì)自動(dòng)往T2表里面插一條記錄
這樣當(dāng)我在T1表上插入新的數(shù)據(jù)時(shí),取@@IDENTITY的時(shí)候,返回的id值是T2表里面的新記錄的值
趕快查了下msdn,原來(lái)@@IDENTITY還有這么多講究:
在一條 INSERT、SELECT INTO 或大容量復(fù)制語(yǔ)句完成后,@@IDENTITY 中包含語(yǔ)句生成的最后一個(gè)標(biāo)識(shí)值。如果語(yǔ)句未影響任何包含標(biāo)識(shí)列的表,則 @@IDENTITY 返回 NULL。如果插入了多個(gè)行,生成了多個(gè)標(biāo)識(shí)值,則 @@IDENTITY 將返回最后生成的標(biāo)識(shí)值。如果語(yǔ)句觸發(fā)了一個(gè)或多個(gè)觸發(fā)器,該觸發(fā)器又執(zhí)行了生成標(biāo)識(shí)值的插入操作,那么,在語(yǔ)句執(zhí)行后立即調(diào)用 @@IDENTITY 將返回觸發(fā)器生成的最后一個(gè)標(biāo)識(shí)值。如果對(duì)包含標(biāo)識(shí)列的表執(zhí)行插入操作后觸發(fā)了觸發(fā)器,并且觸發(fā)器對(duì)另一個(gè)沒(méi)有標(biāo)識(shí)列的表執(zhí)行了插入操作,則 @@IDENTITY 將返回第一次插入的標(biāo)識(shí)值。出現(xiàn) INSERT 或 SELECT INTO 語(yǔ)句失敗或大容量復(fù)制失敗,或者事務(wù)被回滾的情況時(shí),@@IDENTITY 值不會(huì)恢復(fù)為以前的設(shè)置。
如果語(yǔ)句和事務(wù)失敗,它們會(huì)更改表的當(dāng)前標(biāo)識(shí),從而使標(biāo)識(shí)列中的值出現(xiàn)不連貫現(xiàn)象。即使未提交試圖向表中插入值的事務(wù),也永遠(yuǎn)無(wú)法回滾標(biāo)識(shí)值。例如,如果因 IGNORE_DUP_KEY 沖突而導(dǎo)致 INSERT 語(yǔ)句失敗,表的當(dāng)前標(biāo)識(shí)值仍然會(huì)增加。
@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 是相似的函數(shù),因?yàn)樗麄兌挤祷夭迦氲奖淼?IDENTITY 列的最后一個(gè)值。
@@IDENTITY 和 SCOPE_IDENTITY 可以返回當(dāng)前會(huì)話中的所有表中生成的最后一個(gè)標(biāo)識(shí)值。但是,SCOPE_IDENTITY 只在當(dāng)前作用域內(nèi)返回值,而 @@IDENTITY 不限于特定的作用域。
IDENT_CURRENT 不受作用域和會(huì)話的限制,而受限于指定的表。IDENT_CURRENT 可以返回任何會(huì)話和任何作用域中為特定表生成的標(biāo)識(shí)值。
@@IDENTITY 函數(shù)的作用域是執(zhí)行該函數(shù)的本地服務(wù)器上的當(dāng)前會(huì)話。此函數(shù)不能應(yīng)用于遠(yuǎn)程或鏈接服務(wù)器。若要獲得其他服務(wù)器上的標(biāo)識(shí)值,請(qǐng)?jiān)谶h(yuǎn)程服務(wù)器或鏈接服務(wù)器上執(zhí)行存儲(chǔ)過(guò)程,并使(在遠(yuǎn)程或鏈接服務(wù)器的環(huán)境中執(zhí)行的)該存儲(chǔ)過(guò)程收集標(biāo)識(shí)值,并將其返回本地服務(wù)器上的發(fā)出調(diào)用的連接。
所以對(duì)多個(gè)表進(jìn)行操作的時(shí)候,最好用
SELECT SCOPE_IDENTITY()和SELECT IDENT_CURRENT(‘T1')方式
T1表上有一個(gè)INSERT的觸發(fā)器,在插入數(shù)據(jù)的時(shí)候,會(huì)自動(dòng)往T2表里面插一條記錄
這樣當(dāng)我在T1表上插入新的數(shù)據(jù)時(shí),取@@IDENTITY的時(shí)候,返回的id值是T2表里面的新記錄的值
趕快查了下msdn,原來(lái)@@IDENTITY還有這么多講究:
在一條 INSERT、SELECT INTO 或大容量復(fù)制語(yǔ)句完成后,@@IDENTITY 中包含語(yǔ)句生成的最后一個(gè)標(biāo)識(shí)值。如果語(yǔ)句未影響任何包含標(biāo)識(shí)列的表,則 @@IDENTITY 返回 NULL。如果插入了多個(gè)行,生成了多個(gè)標(biāo)識(shí)值,則 @@IDENTITY 將返回最后生成的標(biāo)識(shí)值。如果語(yǔ)句觸發(fā)了一個(gè)或多個(gè)觸發(fā)器,該觸發(fā)器又執(zhí)行了生成標(biāo)識(shí)值的插入操作,那么,在語(yǔ)句執(zhí)行后立即調(diào)用 @@IDENTITY 將返回觸發(fā)器生成的最后一個(gè)標(biāo)識(shí)值。如果對(duì)包含標(biāo)識(shí)列的表執(zhí)行插入操作后觸發(fā)了觸發(fā)器,并且觸發(fā)器對(duì)另一個(gè)沒(méi)有標(biāo)識(shí)列的表執(zhí)行了插入操作,則 @@IDENTITY 將返回第一次插入的標(biāo)識(shí)值。出現(xiàn) INSERT 或 SELECT INTO 語(yǔ)句失敗或大容量復(fù)制失敗,或者事務(wù)被回滾的情況時(shí),@@IDENTITY 值不會(huì)恢復(fù)為以前的設(shè)置。
如果語(yǔ)句和事務(wù)失敗,它們會(huì)更改表的當(dāng)前標(biāo)識(shí),從而使標(biāo)識(shí)列中的值出現(xiàn)不連貫現(xiàn)象。即使未提交試圖向表中插入值的事務(wù),也永遠(yuǎn)無(wú)法回滾標(biāo)識(shí)值。例如,如果因 IGNORE_DUP_KEY 沖突而導(dǎo)致 INSERT 語(yǔ)句失敗,表的當(dāng)前標(biāo)識(shí)值仍然會(huì)增加。
@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 是相似的函數(shù),因?yàn)樗麄兌挤祷夭迦氲奖淼?IDENTITY 列的最后一個(gè)值。
@@IDENTITY 和 SCOPE_IDENTITY 可以返回當(dāng)前會(huì)話中的所有表中生成的最后一個(gè)標(biāo)識(shí)值。但是,SCOPE_IDENTITY 只在當(dāng)前作用域內(nèi)返回值,而 @@IDENTITY 不限于特定的作用域。
IDENT_CURRENT 不受作用域和會(huì)話的限制,而受限于指定的表。IDENT_CURRENT 可以返回任何會(huì)話和任何作用域中為特定表生成的標(biāo)識(shí)值。
@@IDENTITY 函數(shù)的作用域是執(zhí)行該函數(shù)的本地服務(wù)器上的當(dāng)前會(huì)話。此函數(shù)不能應(yīng)用于遠(yuǎn)程或鏈接服務(wù)器。若要獲得其他服務(wù)器上的標(biāo)識(shí)值,請(qǐng)?jiān)谶h(yuǎn)程服務(wù)器或鏈接服務(wù)器上執(zhí)行存儲(chǔ)過(guò)程,并使(在遠(yuǎn)程或鏈接服務(wù)器的環(huán)境中執(zhí)行的)該存儲(chǔ)過(guò)程收集標(biāo)識(shí)值,并將其返回本地服務(wù)器上的發(fā)出調(diào)用的連接。
所以對(duì)多個(gè)表進(jìn)行操作的時(shí)候,最好用
SELECT SCOPE_IDENTITY()和SELECT IDENT_CURRENT(‘T1')方式
相關(guān)文章
教你輕松學(xué)會(huì)SQL Server記錄輪班的技巧
員工使用電子時(shí)鐘進(jìn)行簽名,這種電子簽名可以自動(dòng)將記錄添加到SQL Server數(shù)據(jù)庫(kù)中。但是,有時(shí)候,需要增加一個(gè)夜班;即使這個(gè)輪班發(fā)生在第二天,它仍然會(huì)被認(rèn)為是第三班2013-11-11SQL?Server跨庫(kù)/服務(wù)器查詢及拓展知識(shí)點(diǎn)
因?yàn)闃I(yè)務(wù)要求,之前碰到需要跨服務(wù)器操作另一個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù),這里總結(jié)下,這篇文章主要給大家介紹了關(guān)于SQL?Server跨庫(kù)/服務(wù)器查詢及拓展知識(shí)點(diǎn)的相關(guān)資料,需要的朋友可以參考下2023-11-11SQL Server實(shí)現(xiàn)分頁(yè)方法介紹
這篇文章介紹了SQL Server實(shí)現(xiàn)分頁(yè)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03sql 查詢本年、本月、本日記錄的語(yǔ)句,附SQL日期函數(shù)
sql 查詢本年、本月、本日記錄的語(yǔ)句,附SQL日期函數(shù),學(xué)習(xí)sql的朋友可以參考下。2011-07-07SQL Server 2008 R2數(shù)據(jù)庫(kù)遷移的實(shí)現(xiàn)方法
這篇文章給大家介紹了SQL Server 2008 R2數(shù)據(jù)庫(kù)遷移的兩種方案簡(jiǎn)要指南,文章通過(guò)圖文結(jié)合介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的小伙伴跟著小編一起來(lái)看看吧2024-01-01sql查詢一個(gè)數(shù)組中是否包含某個(gè)內(nèi)容find_in_set問(wèn)題
這篇文章主要介紹了sql查詢一個(gè)數(shù)組中是否包含某個(gè)內(nèi)容find_in_set問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01淺談mssql access數(shù)據(jù)庫(kù) top分頁(yè)方法
雙top法相比于not in和max法,就是可以傳入一條sql語(yǔ)句來(lái)生成分頁(yè)sql語(yǔ)句,也可多字段排序2013-10-10