今天做了一個應用,對TAB_1表進行插入操作的時候,需要獲取自增ID的值,插入到TAB_2里面,隱隱約約記得SQL里面有個全局變量@@IDENTITY可以實現這樣的業務需要,憑著感覺寫了下面的SQL語句。
string sql = "INSERT INTO TAB_1(COL_1) VALUES('VALUE_1') INSERT INTO TAB_2(COL_1) VALUES(SELECT @@IDENTITY)"
結果報錯.....看來第一感覺還是錯了。
GOOGLE找一下,搜索了關鍵字“SQL 獲取自增列 插入”結果搜出N多答案,大概可以分成幾類:
1.對TAB_1進行插入操作后,通過SqlHeper.ExecuteScalar執行"SELECT @@IDENTITY"這樣的SQL語句來返回一個Object,這樣需要把自增列取到程序中再進行拼接SQL處理。
2.還看到一猛男這樣寫的:
string sql = "INSERT INTO TAB_1(COL_1) VALUES('VALUE_1') INSERT INTO TAB_2(COL_1) VALUES(SELECT CAST(@@SCOPE_IDENTITY() AS INT))" 結果一運行還是報錯。
思考:這個時候站起來倒茶,思考下,難道想一句SQL語句不能實現嗎?突然想到以前看PetShop的源碼的時候,有類似的實現的。
string sql = "INSERT INTO TAB_1(COL_1) VALUES('VALUE_1') DECLARE @UID INT SELECT @UID = SCOPE_IDENTITY() INSERT INTO TAB_2(COL_1) VALUES(@UID)"
這時候懷著激動的心情F5刷新,運行成功沒有報錯,檢查數據庫插入TAB_1時生成的自增主鍵,已經插入到TAB_2中去了,業務邏輯實現實現的同時,也達到我的期望值,Perfect...懷著激動的心情寫下了這篇日志,記錄下心情。最后就是附上一點網上收集的資料。
--------------------------------------------------------------------------------------------------------------------------------------------
@@IDENTITY
返回最后插入的標識值。
語法
@@IDENTITY
返回類型
numeric
注釋
在一條 INSERT、SELECT INTO 或大容量復制語句完成后,@@IDENTITY 中包含此語句產生的最后的標識值。若此語句沒有影響任何有標識列的表,則 @@IDENTITY 返回 NULL。若插入了多個行,則會產生多個標識值,@@IDENTITY 返回最后產生的標識值。如果此語句激發一個或多個執行產生標識值的插入操作的觸發器,則語句執行后立即調用 @@IDENTITY 將返回由觸發器產生的最后的標識值。若 INSERT 或 SELECT INTO 語句失敗或大容量復制失敗,或事務被回滾,則 @@IDENTITY 值不會還原為以前的設置。
在返回插入到表的 @@IDENTITY 列的最后一個值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函數類似。
@@IDENTITY 和 SCOPE_IDENTITY 將返回在當前會話的所有表中生成的最后一個標識值。但是,SCOPE_IDENTITY 只在當前作用域內返回值,而 @@IDENTITY 不限于特定的作用域。
IDENT_CURRENT 不受作用域和會話的限制,而受限于指定的表。IDENT_CURRENT 返回任何會話和任何作用域中為特定表生成的標識值。有關更多信息,請參見 IDENT_CURRENT。
示例
下面的示例向帶有標識列的表中插入一行,并用 @@IDENTITY 顯示在新行中使用的標識值。
INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'
---------------------------------
從SQL的幫助文檔中直接COPY過來的,其實微軟的幫助文檔是最好的老師,最好學會直接查看幫助文檔.
轉自:http://www.cnblogs.com/JavCof/