Wat is de beste manier om IDENTITEIT
van een ingevoegde rij te krijgen?
Ik weet van @@IDENTITY
en IDENT_CURRENT
en SCOPE_IDENTITY
, maar ik begrijp de voors en tegens niet die aan elk verbonden zijn.
Kan iemand mij uitleggen wat de verschillen zijn en wanneer ik ze zou moeten gebruiken?
@@IDENTITY
]1 geeft de laatst gegenereerde identiteitswaarde voor elke tabel in de huidige sessie, over alle scopes. Je moet hier voorzichtig zijn, omdat het over scopes gaat. Je zou een waarde kunnen krijgen van een trigger, in plaats van je huidige statement.
SCOPE_IDENTITY()
]2 geeft de laatst gegenereerde identiteitswaarde voor elke tabel in de huidige sessie en het huidige bereik. Normaal gesproken wat je wilt gebruiken.
IDENT_CURRENT('tableName')
]3 geeft de laatst gegenereerde identiteitswaarde voor een specifieke tabel in elke sessie en elk bereik. Dit laat je specificeren van welke tabel je de waarde wilt hebben, in het geval dat de twee bovenstaande niet helemaal zijn wat je nodig hebt (zeer zeldzaam). Ook, zoals @Guy Starbuck opmerkte, "Je zou dit kunnen gebruiken als je de huidige IDENTITEITSwaarde wilt krijgen voor een tabel waarin je nog geen record hebt ingevoegd."
De OUTPUT
clausule van het INSERT
statement geeft je toegang tot elke rij die is ingevoegd via dat statement. Omdat het op het specifieke statement is gericht, is het eenvoudiger dan de andere functies hierboven. Het is echter een beetje meer omslachtig (je'moet invoegen in een tabel variabele/temp tabel en dan query's uitvoeren) en het geeft resultaten zelfs in een foutscenario waar het statement wordt teruggerold. Dat gezegd hebbende, als je query een parallel uitvoeringsplan gebruikt, is dit de alleen gegarandeerde methode om de identiteit te krijgen (afgezien van het uitschakelen van parallellisme). Het wordt echter vóór triggers uitgevoerd en kan niet worden gebruikt om trigger-gegenereerde waarden terug te geven.
@@IDENTITY, SCOPE_IDENTITY, en IDENT_CURRENT zijn soortgelijke functies in die zin dat ze de laatste waarde teruggeven die in de kolom IDENTITY van een tabel is ingevoegd.
@@IDENTITY en SCOPE_IDENTITY geven de laatste identiteitswaarde terug die in een tabel in de huidige sessie is ingevoegd. SCOPE_IDENTITY geeft echter alleen de waarde binnen het huidige bereik terug; @@IDENTITY is niet beperkt tot een specifiek bereik.
IDENT_CURRENT is niet beperkt door scope en sessie; het is beperkt tot een gespecificeerde tabel. IDENT_CURRENT retourneert de identiteitswaarde die is gegenereerd voor een specifieke tabel in elke sessie en elk bereik. Voor meer informatie, zie IDENT_CURRENT.
@@IDENTITY is de laatst ingevoegde identiteit met de huidige SQL Verbinding. Dit is een goede waarde om terug te geven van een insert stored procedure, waar u alleen de identiteit nodig heeft die is ingevoegd voor uw nieuwe record, en het niet kan schelen of er daarna nog meer rijen zijn toegevoegd.
SCOPE_IDENTITY is de laatste identiteit die is ingevoegd met gebruikmaking van de huidige SQL Verbinding, en in het huidige bereik -- dat wil zeggen, als er een tweede IDENTITEIT was ingevoegd op basis van een trigger na uw insert, zou het niet worden weerspiegeld in SCOPE_IDENTITY, alleen de insert die u uitvoerde. Eerlijk gezegd heb ik nog nooit een reden gehad om dit te gebruiken.
IDENT_CURRENT(tablename) is de laatst ingevoegde identiteit, ongeacht verbinding of bereik. Je zou dit kunnen gebruiken als je de huidige IDENTITY waarde wilt krijgen voor een tabel waar je nog geen record hebt ingevoegd.