sql当等INSERT之后获取主键值
生活随笔
收集整理的這篇文章主要介紹了
sql当等INSERT之后获取主键值
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
SQL ? SERVER ? 2000 ? 中的標識值獲取函數 ? ?
? IDENTITY(標識)列,也有很多人稱之為自增列,在SQL ? Server ? 2000中,標識列通過IDENTITY來定義,下面是與獲取最后插入記錄的標識值有 ?
? ?
? 關的函數的一個示例說明 ? ?
? ?
? ? ? ? ? SQL ? Server ? 中,可以使用 ? SCOPE_IDENTITY()、 ? @@IDENTITY ? 、 ? IDENT_CURRENT() ? 來取得最后插入記錄的值值,它們的區別在于: ?
? SCOPE_IDENTITY() ? 返回插入到同一作用域中的 ? IDENTITY ? 列內的最后一個 ? IDENTITY ? 值。一個作用域就是一個模塊——存儲過程、觸發器、函 ?
? ?
? 數或批處理。因此,如果兩個語句處于同一個存儲過程、函數或批處理中,則它們位于相同的作用域中。 ?
? @@IDENTITY ? ? ? ? ? ? ? 返回在當前會話的所有表中生成的最后一個標識值 ?
? IDENT_CURRENT() ? ? 返回為任何會話和任何作用域中的指定表最后生成的標識值 ?
? 下面以一個示例來說明它們的區別 ? ?
? ?
? -- ? a) ? 示例代碼 ? ?
? -- ? =========================================== ?
? -- ? 創建測試表 ?
? -- ? =========================================== ?
? USE ? tempdb ?
? GO ?
? ?
? CREATE ? TABLE ? t1(id ? int ? IDENTITY,col ? int) ?
? INSERT ? t1 ? SELECT ? 1 ?
? UNION ? ALL ? SELECT ? 2 ?
? CREATE ? TABLE ? t2(id ? int ? IDENTITY,col ? int) ?
? GO ?
? ?
? CREATE ? TRIGGER ? TR_insert_t2 ? ON ? t2 ?
? FOR ? INSERT ?
? AS ?
? ? ? ? ? INSERT ? t1 ? SELECT ? 3 ?
? GO ? ?
? ?
? -- ? =========================================== ?
? -- ? 測試三個函數..1 ?
? -- ? =========================================== ?
? INSERT ? t2 ? VALUES(1) ?
? SELECT ? [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), ?
? ? ? ? ? [@@IDENTITY]=@@IDENTITY, ?
? ? ? ? ? [IDENT_CURRENT() ? For ? t1]=IDENT_CURRENT(N't1'), ?
? ? ? ? ? [IDENT_CURRENT() ? For ? t2]=IDENT_CURRENT(N't2') ?
? ?
? /*--結果 ?
? SCOPE_IDENTITY() ? ? ? @@IDENTITY ? ? ? IDENT_CURRENT() ? For ? t1 ? ? ? ? ? IDENT_CURRENT() ? For ? t2 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ------------------ ? ------------ ? -------------------------- ? ----------------------- ?
? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3 ? ? ? ? ? ? ? ? ? ? ? ? 3 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1 ?
? ?
? (所影響的行數為 ? 1 ? 行) ?
? --*/ ?
? GO ?
? ?
? -- ? =========================================== ?
? -- ? 測試三個函數..2 ?
? -- ? =========================================== ?
? INSERT ? t1 ? VALUES(10) ?
? SELECT ? [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), ?
? ? ? ? ? [@@IDENTITY]=@@IDENTITY, ?
? ? ? ? ? [IDENT_CURRENT() ? For ? t1]=IDENT_CURRENT(N't1'), ?
? ? ? ? ? [IDENT_CURRENT() ? For ? t2]=IDENT_CURRENT(N't2') ?
? ?
? /*--結果 ?
? SCOPE_IDENTITY() ? ? ? @@IDENTITY ? ? ? IDENT_CURRENT() ? For ? t1 ? ? ? ? ? IDENT_CURRENT() ? For ? t2 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ------------------ ? ------------ ? -------------------------- ? ----------------------- ?
? 4 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4 ? ? ? ? ? ? ? ? ? ? ? ? 4 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1 ?
? ?
? (所影響的行數為 ? 1 ? 行) ?
? --*/ ?
? GO ?
? ?
? -- ? =========================================== ?
? -- ? 測試三個函數..3 ?
? -- ? ** ? 開啟一個新連接,執行下面的代碼 ? ** ?
? -- ? =========================================== ?
? SELECT ? [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), ?
? ? ? ? ? [@@IDENTITY]=@@IDENTITY, ?
? ? ? ? ? [IDENT_CURRENT() ? For ? t1]=IDENT_CURRENT(N't1'), ?
? ? ? ? ? [IDENT_CURRENT() ? For ? t2]=IDENT_CURRENT(N't2') ?
? ?
? /*--結果 ?
? SCOPE_IDENTITY() ? ? ? @@IDENTITY ? ? ? IDENT_CURRENT() ? For ? t1 ? ? ? ? ? IDENT_CURRENT() ? For ? t2 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ------------------ ? ------------ ? -------------------------- ? ----------------------- ?
? NULL ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NULL ? ? ? ? ? ? ? ? ? 4 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &n ? ?
? ?
? --=========================================== ?
? -- ? 刪除測試環境 ?
? -- ? =========================================== ?
? DROP ? TABLE ? t1,t2 ? ?
? ?
? -- ? b) ? 代碼結果說明 ? ?
? 從上面的代碼可以看到: ?
? IDENT_CURRENT() ? ? 始終返回指定表最后插入的標識值 ?
? @@IDENTITY ? ? ? ? ? ? ? 返回當前會話的標識值,無論是否在同一個作用域,在測試1、2中,可以看到它返回的是觸發器中插入記錄的標識值,而在 ?
? ?
? 測試3中,因為當前會話無插入記錄,所以返回NULL ?
? SCOPE_IDENTITY() ? 返回當前會話同一作用域的標識值,所以在測試1、2中,它返回的值不受觸發器的影響,而在測試3中,因為當前會話無插 ?
? ?
? 入記錄,所以返回NULL
? IDENTITY(標識)列,也有很多人稱之為自增列,在SQL ? Server ? 2000中,標識列通過IDENTITY來定義,下面是與獲取最后插入記錄的標識值有 ?
? ?
? 關的函數的一個示例說明 ? ?
? ?
? ? ? ? ? SQL ? Server ? 中,可以使用 ? SCOPE_IDENTITY()、 ? @@IDENTITY ? 、 ? IDENT_CURRENT() ? 來取得最后插入記錄的值值,它們的區別在于: ?
? SCOPE_IDENTITY() ? 返回插入到同一作用域中的 ? IDENTITY ? 列內的最后一個 ? IDENTITY ? 值。一個作用域就是一個模塊——存儲過程、觸發器、函 ?
? ?
? 數或批處理。因此,如果兩個語句處于同一個存儲過程、函數或批處理中,則它們位于相同的作用域中。 ?
? @@IDENTITY ? ? ? ? ? ? ? 返回在當前會話的所有表中生成的最后一個標識值 ?
? IDENT_CURRENT() ? ? 返回為任何會話和任何作用域中的指定表最后生成的標識值 ?
? 下面以一個示例來說明它們的區別 ? ?
? ?
? -- ? a) ? 示例代碼 ? ?
? -- ? =========================================== ?
? -- ? 創建測試表 ?
? -- ? =========================================== ?
? USE ? tempdb ?
? GO ?
? ?
? CREATE ? TABLE ? t1(id ? int ? IDENTITY,col ? int) ?
? INSERT ? t1 ? SELECT ? 1 ?
? UNION ? ALL ? SELECT ? 2 ?
? CREATE ? TABLE ? t2(id ? int ? IDENTITY,col ? int) ?
? GO ?
? ?
? CREATE ? TRIGGER ? TR_insert_t2 ? ON ? t2 ?
? FOR ? INSERT ?
? AS ?
? ? ? ? ? INSERT ? t1 ? SELECT ? 3 ?
? GO ? ?
? ?
? -- ? =========================================== ?
? -- ? 測試三個函數..1 ?
? -- ? =========================================== ?
? INSERT ? t2 ? VALUES(1) ?
? SELECT ? [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), ?
? ? ? ? ? [@@IDENTITY]=@@IDENTITY, ?
? ? ? ? ? [IDENT_CURRENT() ? For ? t1]=IDENT_CURRENT(N't1'), ?
? ? ? ? ? [IDENT_CURRENT() ? For ? t2]=IDENT_CURRENT(N't2') ?
? ?
? /*--結果 ?
? SCOPE_IDENTITY() ? ? ? @@IDENTITY ? ? ? IDENT_CURRENT() ? For ? t1 ? ? ? ? ? IDENT_CURRENT() ? For ? t2 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ------------------ ? ------------ ? -------------------------- ? ----------------------- ?
? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3 ? ? ? ? ? ? ? ? ? ? ? ? 3 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1 ?
? ?
? (所影響的行數為 ? 1 ? 行) ?
? --*/ ?
? GO ?
? ?
? -- ? =========================================== ?
? -- ? 測試三個函數..2 ?
? -- ? =========================================== ?
? INSERT ? t1 ? VALUES(10) ?
? SELECT ? [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), ?
? ? ? ? ? [@@IDENTITY]=@@IDENTITY, ?
? ? ? ? ? [IDENT_CURRENT() ? For ? t1]=IDENT_CURRENT(N't1'), ?
? ? ? ? ? [IDENT_CURRENT() ? For ? t2]=IDENT_CURRENT(N't2') ?
? ?
? /*--結果 ?
? SCOPE_IDENTITY() ? ? ? @@IDENTITY ? ? ? IDENT_CURRENT() ? For ? t1 ? ? ? ? ? IDENT_CURRENT() ? For ? t2 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ------------------ ? ------------ ? -------------------------- ? ----------------------- ?
? 4 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4 ? ? ? ? ? ? ? ? ? ? ? ? 4 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1 ?
? ?
? (所影響的行數為 ? 1 ? 行) ?
? --*/ ?
? GO ?
? ?
? -- ? =========================================== ?
? -- ? 測試三個函數..3 ?
? -- ? ** ? 開啟一個新連接,執行下面的代碼 ? ** ?
? -- ? =========================================== ?
? SELECT ? [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), ?
? ? ? ? ? [@@IDENTITY]=@@IDENTITY, ?
? ? ? ? ? [IDENT_CURRENT() ? For ? t1]=IDENT_CURRENT(N't1'), ?
? ? ? ? ? [IDENT_CURRENT() ? For ? t2]=IDENT_CURRENT(N't2') ?
? ?
? /*--結果 ?
? SCOPE_IDENTITY() ? ? ? @@IDENTITY ? ? ? IDENT_CURRENT() ? For ? t1 ? ? ? ? ? IDENT_CURRENT() ? For ? t2 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ------------------ ? ------------ ? -------------------------- ? ----------------------- ?
? NULL ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NULL ? ? ? ? ? ? ? ? ? 4 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &n ? ?
? ?
? --=========================================== ?
? -- ? 刪除測試環境 ?
? -- ? =========================================== ?
? DROP ? TABLE ? t1,t2 ? ?
? ?
? -- ? b) ? 代碼結果說明 ? ?
? 從上面的代碼可以看到: ?
? IDENT_CURRENT() ? ? 始終返回指定表最后插入的標識值 ?
? @@IDENTITY ? ? ? ? ? ? ? 返回當前會話的標識值,無論是否在同一個作用域,在測試1、2中,可以看到它返回的是觸發器中插入記錄的標識值,而在 ?
? ?
? 測試3中,因為當前會話無插入記錄,所以返回NULL ?
? SCOPE_IDENTITY() ? 返回當前會話同一作用域的標識值,所以在測試1、2中,它返回的值不受觸發器的影響,而在測試3中,因為當前會話無插 ?
? ?
? 入記錄,所以返回NULL
轉載于:https://www.cnblogs.com/cqsar/articles/1065861.html
總結
以上是生活随笔為你收集整理的sql当等INSERT之后获取主键值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无法添加选择的Web部件
- 下一篇: 每天学一点flash(40) 制作走马灯