Identifikationswert-Abruffunktion in SQL SERVER 2000 In SQL Server 2000 wird die Identitätsspalte durch IDENTITY definiert, und das Folgende bezieht sich auf das Erlangen des Identitätswerts des zuletzt eingefügten Datensatzes
Ein Beispiel für die Funktion von off
In SQL Server können Sie SCOPE_IDENTITY(), @@IDENTITY, IDENT_CURRENT() verwenden, um den Wert des zuletzt eingefügten Datensatzes zu erhalten, und der Unterschied zwischen ihnen ist: SCOPE_IDENTITY() gibt den letzten IDENTITY-Wert zurück, der in der Spalte IDENTITY im selben Scope eingefügt wurde. Ein Scope ist ein Modul – gespeicherte Prozeduren, Trigger, Funktionen
Zahlen oder Chargen. Wenn sich also zwei Anweisungen im selben gespeicherten Verfahren, Funktion oder Batch befinden, befinden sie sich im selben Scope. @@IDENTITY Gibt den zuletzt in allen Tabellen der aktuellen Sitzung generierten Identifikationswert zurück IDENT_CURRENT() gibt den zuletzt für die angegebenen Tabelle in jeder Sitzung und jedem Scope erzeugten Identifikationswert zurück Hier ein Beispiel, um ihre Unterschiede zu veranschaulichen
-- a) Beispielcode -- =========================================== -- Erstellen Sie eine Testtabelle -- =========================================== USE tempdb LOS
CREATE TABLE t1(id int IDENTITY,col int) T1 EINFÜGEN SELECT 1 UNION ALLE AUSWÄHLEN 2 CREATE TABLE t2(id int IDENTITY,col int) LOS
TRIGGER TR_insert_t2 AUF T2 ERSTELLEN FÜR INSERT AS T1 EINFÜGEN SELECT 3 LOS
-- =========================================== -- Drei Funktionen testen: 1 -- =========================================== T2-WERTE EINFÜGEN(1) SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() Für t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() Für t2]=IDENT_CURRENT(N't2')
/*--Ergebnis SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() Für t1 IDENT_CURRENT() Für t2 ------------------ ------------ -------------------------- ----------------------- 1 3 3 1
(Die Anzahl der betroffenen Zeilen beträgt 1 Reihe) --*/ LOS
-- =========================================== -- Drei Funktionen testen: 2 -- =========================================== T1-WERTE EINFÜGEN(10) SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() Für t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() Für t2]=IDENT_CURRENT(N't2')
/*--Ergebnis SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() Für t1 IDENT_CURRENT() Für t2 ------------------ ------------ -------------------------- ----------------------- 4 4 4 1
(Die Anzahl der betroffenen Zeilen beträgt 1 Reihe) --*/ LOS
-- =========================================== -- Drei Funktionen testen: 3 -- ** Eröffne eine neue Verbindung und führe folgenden Code aus ** -- =========================================== SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() Für t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() Für t2]=IDENT_CURRENT(N't2')
/*--Ergebnis SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() Für t1 IDENT_CURRENT() Für t2 ------------------ ------------ -------------------------- ----------------------- NULL NULL 4 &n
--=========================================== -- Lösche die Testumgebung -- =========================================== DROPP-TABELLE T1,T2
-- b) Codeergebnisbeschreibung Wie Sie aus dem obigen Code sehen können: IDENT_CURRENT() gibt immer den zuletzt identifizierten Wert zurück, der in der angegebenen Tabelle eingefügt ist @@IDENTITY Gibt in Tests 1 und 2 den Identitätswert der aktuellen Sitzung zurück, egal ob im gleichen Umfang oder nicht, in Tests 1 und 2 ist zu erkennen, dass der Identitätswert des eingefügten Datensatzes im Trigger zurückgegeben wird, und in
In Test 3 wird NULL zurückgegeben, weil es in der aktuellen Sitzung keinen Einfügungseintrag gibt SCOPE_IDENTITY() gibt den Identifikationswert desselben Umfangs der aktuellen Sitzung zurück, sodass in Test 1 und 2 der Wert zurückgegeben wird, der vom Trigger nicht beeinflusst wird, und in Test 3, weil die aktuelle Sitzung nicht interpoliert ist
Datensatz, also gibt es NULL zurück
|