Najlepší spôsob, ako získať identitu vloženého riadku?

Aký je najlepší spôsob na získanie IDENTITY vloženého riadku?

Viem o @@IDENTITY a IDENT_CURRENT a SCOPE_IDENTITY, ale nerozumiem výhodám a nevýhodám, ktoré sú s nimi spojené.

Mohol by mi niekto vysvetliť rozdiely a kedy by som mal jednotlivé položky používať?

Riešenie
  • @@IDENTITY vráti poslednú hodnotu identity vygenerovanú pre akúkoľvek tabuľku v aktuálnej relácii vo všetkých oblastiach. Tu musíte byť opatrní, pretože sa to týka všetkých rozsahov. Namiesto aktuálneho príkazu by ste mohli získať hodnotu zo spúšťača.

  • SCOPE_IDENTITY() vráti poslednú hodnotu identity vygenerovanú pre akúkoľvek tabuľku v aktuálnej relácii a aktuálnom rozsahu. Všeobecne to, čo chcete použiť.

  • IDENT_CURRENT('tableName') vráti poslednú hodnotu identity vygenerovanú pre konkrétnu tabuľku v ľubovoľnej relácii a ľubovoľnom rozsahu. To vám umožňuje špecifikovať, z ktorej tabuľky chcete hodnotu, v prípade, že vyššie uvedené dve nie sú úplne to, čo potrebujete (veľmi zriedkavé). Takisto, ako spomenul @Guy Starbuck, "Toto môžete použiť, ak chcete získať aktuálnu hodnotu IDENTITY pre tabuľku, do ktorej ste nevložili záznam."

  • Klauzula OUTPUT príkazu INSERT vám umožní prístup ku každému riadku, ktorý bol vložený prostredníctvom tohto príkazu. Keďže sa vzťahuje na konkrétny príkaz, je to jednoduchšie ako ostatné vyššie uvedené funkcie. Je však o niečo rozsiahlejšia (musíte vložiť do premennej tabuľky/temp tabuľky a potom sa na ňu opýtať) a poskytuje výsledky aj v prípade chyby, keď sa príkaz vráti späť. Ak však váš dotaz používa paralelný plán vykonávania, je to jediná zaručená metóda na získanie identity (okrem vypnutia paralelizmu). Vykonáva sa však pred spúšťačmi a nemožno ju použiť na vrátenie hodnôt generovaných spúšťačmi.

Komentáre (14)

MSDN

@@IDENTITY, SCOPE_IDENTITY a IDENT_CURRENT sú podobné funkcie, pretože vracajú poslednú hodnotu vloženú do stĺpca IDENTITY tabuľky.

@@IDENTITY a SCOPE_IDENTITY vrátia poslednú hodnotu identity vytvorenú v ľubovoľnej tabuľke v aktuálnej relácii. Funkcia SCOPE_IDENTITY však vracia hodnotu len v rámci aktuálneho rozsahu; @@IDENTITY nie je obmedzená na konkrétny rozsah.

IDENT_CURRENT nie je obmedzený rozsahom a reláciou; je obmedzený na určenú tabuľku. IDENT_CURRENT vracia hodnotu identity vytvorenú pre konkrétnu tabuľku v ľubovoľnej relácii a ľubovoľnom rozsahu. Viac informácií nájdete v časti IDENT_CURRENT.

  • IDENT_CURRENT]2 je funkcia, ktorá ako argument prijíma tabuľku.
  • Funkcia @@IDENTITY môže vrátiť mätúci výsledok, ak máte na tabuľke spúšťač
  • SCOPE_IDENTITY je väčšinou vaším hrdinom.
Komentáre (0)

@@IDENTITY je posledná identita vložená pomocou aktuálneho pripojenia SQL. Túto hodnotu je dobré vrátiť z uloženej procedúry insert, keď potrebujete len identitu vloženú pre nový záznam a nezaujíma vás, či boli neskôr pridané ďalšie riadky.

SCOPE_IDENTITY je posledná identita vložená pomocou aktuálneho SQL Connection a v aktuálnom rozsahu - to znamená, že ak by bola po vašom vložení vložená druhá IDENTITA na základe spúšťača, nepremietla by sa do SCOPE_IDENTITY, iba do vloženia, ktoré ste vykonali. Úprimne povedané, nikdy som nemal dôvod to používať.

IDENT_CURRENT(tablename) je posledná vložená identita bez ohľadu na pripojenie alebo rozsah. Mohli by ste to použiť, ak chcete získať aktuálnu hodnotu IDENTITY pre tabuľku, do ktorej ste nevložili záznam.

Komentáre (2)