Identificatiewaarde-ophaalfunctie in SQL SERVER 2000 In SQL Server 2000 wordt de identiteitskolom gedefinieerd door IDENTITY, en het volgende heeft betrekking op het verkrijgen van de identiteitswaarde van het laatst ingevoegde record
Een voorbeeldillustratie van de functie van off
In SQL Server kun je SCOPE_IDENTITY(), @@IDENTITY, IDENT_CURRENT() gebruiken om de waarde van het laatst ingevoegde record te krijgen, en het verschil tussen deze is als volgt: SCOPE_IDENTITY() geeft de laatst ingevoerde IDENTITY-waarde terug in de kolom IDENTITY in dezelfde scope. Een scope is een module - opgeslagen procedures, triggers, functies
Aantallen of batches. Daarom, als twee statements in dezelfde opgeslagen procedure, functie of batch zitten, vallen ze in dezelfde scope. @@IDENTITY Geeft de laatst gegenereerde identificatiewaarde terug die in alle tabellen in de huidige sessie is gegenereerd IDENT_CURRENT() geeft de laatst gegenereerde identificatiewaarde terug voor de opgegeven tabel in elke sessie en elke scope Hier is een voorbeeld om hun verschillen te illustreren
-- a) Voorbeeldcode -- =========================================== -- Maak een testtabel aan -- =========================================== USE tempdb GA
CREATE TABLE t1(id int IDENTITY,col int) VOEG t1 IN, SELECTEER 1 VAKBOND ALLEN SELECTEREN 2 CREATE TABLE t2(id int IDENTITY,col int) GA
MAAK TRIGGER TR_insert_t2 OP T2 AAN VOOR INZET AS VOEG t1 SELECTEER 3 GA
-- =========================================== -- Test drie functies: 1 -- =========================================== VOEG T2-WAARDEN IN(1) SELECTEER [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() Voor t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() Voor t2]=IDENT_CURRENT(N't2')
/*--Resultaat SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() Voor t1 IDENT_CURRENT() Voor t2 ------------------ ------------ -------------------------- ----------------------- 1 3 3 1
(Het aantal getroffen rijen is 1 rij) --*/ GA
-- =========================================== -- Test drie functies: 2 -- =========================================== VUL t1-WAARDEN IN(10) SELECTEER [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() Voor t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() Voor t2]=IDENT_CURRENT(N't2')
/*--Resultaat SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() Voor t1 IDENT_CURRENT() Voor t2 ------------------ ------------ -------------------------- ----------------------- 4 4 4 1
(Het aantal getroffen rijen is 1 rij) --*/ GA
-- =========================================== -- Test drie functies: 3 -- ** Open een nieuwe verbinding en voer de volgende code uit ** -- =========================================== SELECTEER [SCOPE_IDENTITY()]=SCOPE_IDENTITY(), [@@IDENTITY]=@@IDENTITY, [IDENT_CURRENT() Voor t1]=IDENT_CURRENT(N't1'), [IDENT_CURRENT() Voor t2]=IDENT_CURRENT(N't2')
/*--Resultaat SCOPE_IDENTITY() @@IDENTITY IDENT_CURRENT() Voor t1 IDENT_CURRENT() Voor t2 ------------------ ------------ -------------------------- ----------------------- NULL NULL 4 &n
--=========================================== -- Verwijder de testomgeving -- =========================================== DROP TABLE t1,t2
-- b) Coderesultaatbeschrijving Zoals je kunt zien uit de bovenstaande code: IDENT_CURRENT() geeft altijd de laatst geïdentificeerde waarde terug die in de opgegeven tabel is ingevoegd @@IDENTITY Retourneert de identiteitswaarde van de huidige sessie, of deze nu in dezelfde scope is of niet, in tests 1 en 2, is te zien dat het de identiteitswaarde van het ingevoegde record in de trigger teruggeeft, en in
In Test 3 wordt NULL teruggegeven omdat er geen insertierecord is in de huidige sessie SCOPE_IDENTITY() geeft de identificatiewaarde terug van dezelfde scope van de huidige sessie, dus in test 1, 2 geeft het de waarde terug die niet door de trigger wordt beïnvloed, en in test 3, omdat de huidige sessie niet geïnterpoleerd is
record, dus het geeft NULL terug
|