Bron: Internet Auteur: Onbekend
- Databases en tabellen aanmaken
maak database MyDataBase aan
gebruik MyDataBase
maak tabel mytable aan
id int identiteit(1,1),
Naam Varchar(20)
)
--Voer deze SQL uit om de waarde te vinden van de zelf-incrementele kolom die overeenkomt met het record dat zojuist is ingevoegd
invoegen in mytable-waarden ('Li Si')
Selecteer @@identity
2. Vergelijking van de drie methoden
In SQL Server 2000 zijn er drie vergelijkbare functies: SCOPE_IDENTITY, IDENT_CURRENT en @@IDENTITY, die allemaal waarden teruggeven die in de kolom IDENTITY zijn ingevoegd.
IDENT_CURRENT Geeft de laatst gegenereerde identificatiewaarde terug voor een specifieke tabel in elke sessie en elke scope. IDENT_CURRENT Niet beperkt door scope en sessie, maar door een gespecificeerde tabel. IDENT_CURRENT Retourneert de waarde die voor een specifieke tabel in elke sessie en scope is gegenereerd.
@@IDENTITY Geeft de laatst gegenereerde identificatiewaarde terug voor een tabel in alle scopes van de huidige sessie.
SCOPE_IDENTITY Retourneert de laatst geïdentificeerde waarde die is gegenereerd voor de huidige sessie en elke tabel in de huidige scope
SCOPE_IDENTITY en @@IDENTITY geven de laatste identificatiewaarde terug die in een tabel in de huidige sessie is gegenereerd. Echter, SCOPE_IDENTITY geeft alleen waarden terug die in de huidige scope zijn ingevoegd; @@IDENTITY Niet beperkt tot een specifiek scope.
Er zijn bijvoorbeeld twee tabellen, T1 en T2, waarop een INSERT-trigger is gedefinieerd. Wanneer een rij in T1 wordt ingevoegd, wordt de trigger geactiveerd en wordt er een rij in T2 geplaatst. Dit voorbeeld illustreert twee scopes: één op T1 en één op T2 als gevolg van de trigger.
Aangenomen dat zowel T1 als T2 IDENTITY-kolommen hebben, zullen @@IDENTITY en SCOPE_IDENTITY aan het einde van de INSERT-instructie op T1 verschillende waarden teruggeven.
@@IDENTITY Retourneert de laatste IDENTITY-kolomwaarde die in een scope in de huidige sessie is ingevoegd, wat de waarde is die in T2 is ingevoegd.
SCOPE_IDENTITY() retourneert de IDENTITY-waarde die in T1 is ingevoegd, wat de laatste INSERT is die in dezelfde scope is voorgekomen. Als de SCOPE_IDENTITY()-functie wordt aangeroepen voordat de insertie-instructie in de identiteitskolom in scope plaatsvindt, geeft de functie een NULL-waarde terug.
De waarden die door IDENT_CURRENT('T1') en IDENT_CURRENT('T2') worden teruggegeven, zijn respectievelijk de laatste zelf-incrementele waarden van de twee tabellen.
ajqc's experiment: (40 lokale threads, 40+40 remote threads gelijktijdige test, waarbij 1200W rijen worden ingevoegd), de conclusie is:
1. In typische cascaderende toepassingen. @@IDENTITY kan niet worden gebruikt, en gelijktijdige conflicten zullen optreden wanneer 1W meerrijig wordt gebruikt op CII850, 256M SD-machines. Op P42.8C en 512M DDR is er een gelijktijdig conflict wanneer er slechts meer dan 6000 lijnen zijn.
2.SCOPE_IDENTITY() is absoluut betrouwbaar en kan worden gebruikt in het opslagproces, zelfs triggers hoeven niet gebouwd te worden en er zijn geen gelijktijdige conflicten
SELECT IDENT_CURRENT('TableName') - Geeft de laatst gegenereerde labelwaarde terug in de opgegeven tabel
SELECT IDENT_INCR('TableName') - retourneert de gemarkeerde veld-incrementwaarde voor de opgegeven tabel
SELECT IDENT_SEED('TableName') - geeft de gemarkeerde veldseed van de opgegeven tabel terug
Geeft het automatische nummer van het laatst ingevoegde record terug.
SELECTEER IDENT_CURRENT('TableName')
Keer terug naar het volgende automatische nummer:
SELECTEER IDENT_CURRENT('TableName')+(SELECT IDENT_INCR('TableName'))
SELECT @@IDENTITY - Retourneert de laatst gemarkeerde waarde die in alle tabellen in de huidige sessie is gegenereerd
|