1. 程式人生 > >SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY返回插入到標識列中的值,但作用域不同

SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY返回插入到標識列中的值,但作用域不同

SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 是相似的函式,因為它們都返回插入到標識列中的值。

SELECT @@IDENTITY AS 'IDENTITY'
SELECT IDENT_CURRENT('table1') AS 'IDENT_CURRENT'
SELECT SCOPE_IDENTITY() AS 'SCOPE_IDENTITY'

IDENT_CURRENT 不受作用域和會話的限制,而受限於指定的表。IDENT_CURRENT 返回為任何會話和作用域中的特定表所生成的值。

SCOPE_IDENTITY 和 @@IDENTITY 返回在當前會話中的任何表內所生成的最後一個標識值。但是,SCOPE_IDENTITY 只返回插入到當前作用域中的值;@@IDENTITY 不受限於特定的作用域。

例如,有兩個表 T1 和 T2,並且在 T1 上定義了 INSERT 觸發器。當將某行插入 T1 時,觸發器被激發,並在 T2 中插入一行。 該方案演示了兩個作用域:在 T1 上的插入,以及在 T2 通過觸發器的插入。

假設 T1 和 T2 都有標識列,@@IDENTITY 和 SCOPE_IDENTITY 將在 T1 上的 INSERT 語句的最後返回不同的值。@@IDENTITY 將返回在當前會話中的任何作用域內插入的最後一個標識列的值。這是在 T2 中插入的值。SCOPE_IDENTITY() 將返回在 T1 中插入的 IDENTITY 值。這是在同一個作用域內發生的最後的插入。如果在任何 INSERT 語句作用於作用域中的標識列之前呼叫 SCOPE_IDENTITY() 函式,則該函式將返回空值。

如果語句和事務失敗,它們會更改表的當前標識,從而使標識列中的值出現不連貫現象。即使未提交試圖向表中插入值的事務,也永遠無法回滾標識值。例如,如果因 IGNORE_DUP_KEY 衝突而導致 INSERT 語句失敗,表的當前標識值仍然會增加。

示例

以下示列建立兩個表,TZTY,並在 TZ 中建立一個 INSERT 觸發器。當將某行插入表 TZ 中時,觸發器 (Ztrig) 將激發並在 TY 中插入一行。

USE tempdb
GO
CREATE TABLE TZ (
   Z_id  int IDENTITY(1,1)PRIMARY KEY,
   Z_name varchar(20) NOT NULL)

INSERT TZ
   VALUES ('Lisa')
INSERT TZ
   VALUES ('Mike')
INSERT TZ
   VALUES ('Carla')

SELECT * FROM TZ

--Result set: This is how table TZ looks.
Z_id   Z_name
-------------
1      Lisa
2      Mike
3      Carla

CREATE TABLE TY (
   Y_id  int IDENTITY(100,5)PRIMARY KEY,
   Y_name varchar(20) NULL)

INSERT TY (Y_name)
   VALUES ('boathouse')
INSERT TY (Y_name)
   VALUES ('rocks')
INSERT TY (Y_name)
   VALUES ('elevator')

SELECT * FROM TY
--Result set: This is how TY looks:
Y_id  Y_name
---------------
100   boathouse
105   rocks
110   elevator

/*Create the trigger that inserts a row in table TY 
when a row is inserted in table TZ*/
CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS 
   BEGIN
   INSERT TY VALUES ('')
   END

/*FIRE the trigger and determine what identity values you obtain 
with the @@IDENTITY and SCOPE_IDENTITY functions.*/
INSERT TZ VALUES ('Rosalie')

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT   @@IDENTITY AS [@@IDENTITY]
GO

下面是結果集: 

SCOPE_IDENTITY
4
/*SCOPE_IDENTITY returned the last identity value in the same scope. 
This was the insert on table TZ.*/

@@IDENTITY
115
/*@@IDENTITY returned the last identity value inserted to TY by the trigger. 
This fired because of an earlier insert on TZ.*/

相關推薦

SCOPE_IDENTITYIDENT_CURRENT @@IDENTITY返回插入標識,作用不同

SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 是相似的函式,因為它們都返回插入到標識列中的值。 SELECT @@IDENTITY AS 'IDENTITY'SELECT IDENT_CURRENT('table1') AS 'IDENT

SCOPE_IDENTITYIDENT_CURRENT @@IDENTITY的比較

SQL Server 2000中,有三個比較類似的功能:他們分別是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它們都返回插入到 IDENTITY 列中的值。  1.IDENT_CURRENT: 不受作用域和會話的限制,僅受限於指定的表

新增資料的自動編號SCOPE_IDENTITYIDENT_CURRENT @@IDENTITY的比較

SQL Server 2000中,有三個比較類似的功能:他們分別是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它們都返回插入到 IDENTITY 列中的值。IDENT_CURRENT 返回為任何會話和任何作用域中的特定表最後生成的標識值。IDENT_CURRENT 不

使用PivotPivot_TableStackUnstack等方法在Pandas對資料變形(重塑)

        Pandas是著名的Python資料分析包,這使它更容易讀取和轉換資料。在Pandas中資料變形意味著轉換表或向量(即DataFrame或Series)的結構,使其進一步適合做其他分析。在本文中,小編將舉例說明最常見的一些Pandas重塑功

使用Matlab進行影象的讀寫顯示縮放(最近臨插雙線性內插法)

上次我們開始進行數字影象處理這門課程的實驗,直到現在才抽空出來寫寫文章,記錄一下知識點。介紹一下,使用Matlab對數字影象的簡單處理。 1、 讀取與顯示輸入影象: %輸入影象和顯示影象 funct

Python之pandas學習筆記(二) 取數篩選,插入行列,賦

如下圖是pandas的Dataframe清洗資料步驟,包括資料行列選取,賦值,更改列名集重建索引的思維導圖: 文章目錄 一、資料選取-普通行列總結: 二、 資料選取-按條件篩選行列 總結 三、重建索引和更改列名總結

如何用DELPHI實現把WORDEXCEL圖片等儲存到資料庫

 用image欄位儲存這些文件。     var         word_stream:   TMemoryStream;         filename:   string;     begin         if   odgDoc.Execut

泛型+反射 實現泛型向資料庫插入資訊類 並返回插入資料的Id

static string conStr = @"server=.;database=a;uid=sa;pwd=a;"; /// <summary> /// Execute

羅爾(Rolle)拉格朗日(Lagrange)柯西(Cauchy)三大微分定理的定義

一、Rolle中值定理 定義: 若函式f(x)滿足{f(x)在[a,b]內連續,在(a,b)內可導f(a)=f(b),則存在ε∈(a,b),使f′(ε)=0成立。 二、Lagrange中值定理

MyBaits基本操作,為什麽session.commit()可以引起事物提交?ResultMap結果映射,執行添加後返回自增,多條件查詢,智能標簽,工具類

info log list image mit fault 類型 工具類 自增列 1.為什麽session.commit()可以引起事務的提交? 首先打開commit()源碼,ctrl+H打開它的實現類DefaultSession,找到它的commit方法 ctrl+左鍵

算法:用兩個棧來實現一個隊,完成隊的PushPop操作。 隊的元素為int類型。《劍指offer》

pack 代碼 exception 隊列 imp scrip 入棧 return tro 算法:用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。《劍指offer》 利用棧來進行操作,代碼註釋寫的比較清楚:首先判斷兩個棧是否是空的:

servlet的三大作用物件jsp的九大內建物件及其四大作用物件

  servlet的三大作用域物件: request(HttpServletRequest) session(HttpSession): application(ServletContext):tomcat啟動時建立,tomcat關閉時銷燬,整個web的生命週期只有一個

Python的變數作用,LEGB規則閉包原理

問題來源   最近看到了一個python程式題,就三行程式碼,卻思考了很久才考慮明白,決定分享一下。 def num(): return [lambda x:i*x for i in range(4)] print([m(2) for m in num()]) 預計結果為:0, 2

jsvar的作用輸出問題

關於js 中var的問題: 1、var宣告的變數是函式作用域; 2、var宣告變數會提前到檔案最開始的地方,但是初始化還是在語句位置。 示例程式碼: var a; console.log(a)

關於struts2直接操作作用操作棧的對比以及棧的理解

 注:參考文章:https://www.cnblogs.com/bamaw/p/7259232.html 自從初學struts2框架以來,時常和值棧打交道。值棧究竟是什麼,對於我們使用者來說值棧是一個非常方便的東西,很形象的可以稱其為“資料中轉站”。為什麼會有這種叫法呢,因為

spring bean的作用生命週期

spring中bean的作用域: 生命週期(官方圖): spring 中bean例項化過程(不好意思,我盜圖了): 1:instantiate bean物件例項化 2:populate properties 封裝屬性 3:如果Bean實現BeanNameAwar

SpringBean的作用生命周期

作用域 spring容器 分享 引用 多少 返回 portlet type 精確 Bean的作用域(scope)   Spring 3定義了五種作用域,分別為singleton(單例)、prototype(原型)、request、session、global sessio

381 Insert Delete GetRandom O(1) - Duplicates allowed O(1) 時間插入刪除獲取隨機元素 - 允許重復

etc size 初始 結構 randomize lse 相同 HERE 時間復雜度 設計一個支持在平均 時間復雜度 O(1) 下, 執行以下操作的數據結構。註意: 允許出現重復元素。 insert(val):向集合中插入元素 val。 remove(val):

C# 如何在Excel表格插入編輯刪除批註

mar mfile load art LV black for 工作表 logo 概述 為文檔添加必要的批註可以給文檔使用者提供重要的提示信息,下面的示例中,將介紹通過C#編程語言來給Excel表格中的指定單元格內容添加批註,此外,對於已有的批註,如果需要修改,我們也可以進

Leetcode 380. 常數時間插入刪除獲取隨機元素

限定 速度 private hash list true keymap 插入 new 題目描述: 設計一個支持在平均 時間復雜度 O(1) 下,執行以下操作的數據結構。 insert(val):當元素 val 不存在時,向集合中插入該項。 remove(val):元素