Share via


SCOPE_IDENTITY (Transact-SQL)

Aynı kapsamkimliği sütun eklenen son kimlik deerini döndürür.kapsam , bir modül yer: bir saklı yordam, tetikleyici, işlevveya toplu iş.Dolayısıyla, aynı saklı yordam, işlevveya toplu işiçinde olmaları durumunda iki ifadeyi aynı kapsam içinde altındadır.

Konu bağlantısı simgesiTransact-SQL sözdizimi kuralları

Sözdizimi

SCOPE_IDENTITY()

Dönüş Türleri

numeric(38,0)

Açıklamalar

Kimlik sütunları eklenen değerleri döndürmeleri SCOPE_IDENTITY, IDENT_CURRENT ve @@ IDENTITY benzer işlevleri olduklarından.

IDENT_CURRENT, kapsam ve oturumile sınırlı değildir; Belirtilen tablosınırlıdır.Tüm oturum ve herhangi bir kapsamiçindeki belirli bir tablo için oluşturulan değer IDENT_CURRENT döndürür.Daha fazla bilgi için, bkz. IDENT_CURRENT (Transact-SQL).

SCOPE_IDENTITY ve @@ IDENTITY herhangi bir tablo geçerli oturumiçinde oluşturulan son kimlik değerleri döndürür.Ancak, SCOPE_IDENTITY yalnızca geçerli kapsamiçinde eklenen değerleri döndürür; @@ IDENTITY, belirli bir kapsamsınırlı değildir.

Örneğin, iki tablo vardır T1 ve T2, ve INSERT tetikleyici tanımlanan T1.Ne zaman bir satır eklendiğinde için T1, tetikleyici harekete ve bir satır ekler T2.Bu senaryo iki kapsamları gösterilmektedir: üzerine ekleme T1ve üzerine ekleme T2 Tetikleyici.

Her iki varsayarak T1 ve T2 sahip kimlik sütunlarının, @@ IDENTITY ve SCOPE_IDENTITY döndürülen farklı değerler INSERT deyim sonunda üzerinde T1.@@ IDENTITY, tüm geçerli oturum kapsam boyunca eklenen son kimlik sütun değerini döndürür.Bu eklenen değer, T2.SCOPE_IDENTITY() eklenebilir kimlik değerini döndürecektir T1.Bu, aynı kapsamiçinde gerçekleşen son INSERT oldu.kapsamiçinde herhangi bir kimlik sütun INSERT deyimleri gerçekleşmeden önce işlev çağrılırsa, SCOPE_IDENTITY() işlev null değeri döndürür.

Başarısız ifadeler ve hareketleri, bir tablo için geçerli kimlik değiştirmek ve boşluklar kimlik sütun değerleri oluşturun.Kimlik değerini geri tablo değeri eklemeye çalıştığınız işlem tamamlanmış olmasa asla döndürülür.Örneğin, bir INSERT deyim IGNORE_DUP_KEY ihlali nedeniyle başarısız olursa, tablo için geçerli kimlik değerini hala artırılır.

Örnekler

A.@@ IDENTITY ve SCOPE_IDENTITY Tetikleyiciler ile kullanma

Aşağıdaki örnek, iki tablo oluşturur TZ ve TYve üzerinde bir INSERT tetikleyicisi TZ.Ne zaman bir satır eklendiğinde tablo TZ, tetikleyici (Ztrig) bir satır ekler ve harekete 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

Sonuç kümesi buradadır.

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.*/

B.@@ IDENTITY ve SCOPE_IDENTITY() ile çoğaltmakullanma

Aşağıdaki örnekler nasıl kullanılacağını @@IDENTITY ve SCOPE_IDENTITY() birleştirme çoğaltmasıiçin yayımlanan bir veritabanında ekler için.Örneklerin her iki tabloda bulunan AdventureWorks2008R2 örnek veritabanı: Person.ContactTypeyayınlanmamış olan, ve Sales.Customer yayımlanır.Birleştirme çoğaltma Tetikleyicileri yayımlanan tablolara ekler.Bu nedenle, @@IDENTITY değer bir kullanıcı tabloEkle yerine bir çoğaltmasistem tablosu INSERT döndürebilirsiniz.

Person.ContactTypetablo 20 en yüksek kimlik değeri vardır. tablo, satır eklerseniz, @@IDENTITY ve SCOPE_IDENTITY() dönüş aynı değeri.

USE AdventureWorks2008R2;
GO
INSERT INTO Person.ContactType ([Name]) VALUES ('Assistant to the Manager');
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO

Sonuç kümesi buradadır.

SCOPE_IDENTITY

21

@@IDENTITY

21

Sales.Customertablo 29483 en yüksek kimlik değeri vardır. tablo, satır eklerseniz, @@IDENTITY ve SCOPE_IDENTITY() dönüş farklı değerler.SCOPE_IDENTITY()INSERT kullanıcı tablo, oysa değerini verir @@IDENTITY çoğaltma sistem tablosuINSERT değerini verir.Use SCOPE_IDENTITY() erişim gerektiren uygulamalar içineklenen kimlik değeri.

INSERT INTO Sales.Customer ([TerritoryID],[PersonID]) VALUES (8,NULL);
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO

Sonuç kümesi buradadır.

SCOPE_IDENTITY

29484

@@IDENTITY

89

Ayrıca bkz.

Başvuru