Zdroj: Internetový autor: Neznámý
- Vytvářet databáze a tabulky
vytvořit databázi MyDataBase
použijte MyDataBase
Vytvořit tabulku v Mytable
id int identity(1,1),
Jméno Varchar(20)
)
--Vykonejte tento SQL a zjistěte hodnotu samoinkrementálního sloupce odpovídajícího právě vloženému záznamu
vložit do tabulky hodnot ('Li Si')
Vyberte @@identity
2. Srovnání tří metod
V SQL Server 2000 existují tři podobné funkce: SCOPE_IDENTITY, IDENT_CURRENT a @@IDENTITY, které všechny vracejí hodnoty vložené do sloupce IDENTITY.
IDENT_CURRENT Vrací poslední identifikační hodnotu generovanou pro konkrétní tabulku v jakékoli relaci a v jakémkoli rozsahu. IDENT_CURRENT Není omezen rozsahem a sezením, ale specifickou tabulkou. IDENT_CURRENT Vrací hodnotu generovanou pro konkrétní tabulku v libovolné relaci a rozsahu.
@@IDENTITY Vrátí poslední identifikační hodnotu generovanou pro libovolnou tabulku ve všech rozsahových oblastech aktuální relace.
SCOPE_IDENTITY Vrací poslední identifikovanou hodnotu, která byla vygenerována pro aktuální relaci, a jakoukoli tabulku v aktuálním rozsahu
SCOPE_IDENTITY a @@IDENTITY vracejí poslední identifikační hodnotu, která byla vygenerována v jakékoli tabulce v aktuální relaci. Nicméně SCOPE_IDENTITY vrací pouze hodnoty vložené do aktuálního rozsahu; @@IDENTITY Není omezeno na konkrétní rozsah.
Například existují dvě tabulky, T1 a T2, ve kterých je definován spouštěč INSERT. Když je řádek vložen do T1, spustí se spoušť a do T2 se vloží řádek. Tento příklad ilustruje dva dalekohledy: jeden na T1 a druhý na T2 jako výsledek spouště.
Za předpokladu, že T1 i T2 mají sloupce IDENTITY, @@IDENTITY a SCOPE_IDENTITY na konci příkazu INSERT na T1 vrátí různé hodnoty.
@@IDENTITY Vrátí poslední hodnotu sloupce IDENTITY vloženou do libovolného rozsahu v aktuální relaci, což je hodnota vložená v T2.
SCOPE_IDENTITY() vrací hodnotu IDENTITY vloženou do T1, což je poslední INSERT, který se odehrál ve stejném rozsahu. Pokud je funkce SCOPE_IDENTITY() vyvolána dříve, než příkaz insertion do sloupce identity nastane v rozsahu, funkce vrátí hodnotu NULL.
Hodnoty vrácené IDENT_CURRENT('T1') a IDENT_CURRENT('T2') jsou posledními samoinkrementálními hodnotami obou tabulek.
Experiment ajqc: (40 lokálních vláken, 40+40 vzdálených vláken současně testuje, vkládá 1200W řádky), závěr je:
1. V typických kaskádových aplikacích. @@IDENTITY nelze použít a současné konflikty docházejí, když je 1W víceřadové na strojích CII850, 256M SD. Na P42.8C a 512M DDR dochází ke současnému konfliktu, když je více než 6000 linek.
2.SCOPE_IDENTITY() je naprosto spolehlivý a lze jej použít v procesu ukládání dat, není třeba vytvářet ani spouštěče a nedochází k současným konfliktům
SELECT IDENT_CURRENT('TableName') - Vrátí poslední hodnotu štítku generovanou ve specifikované tabulce
SELECT IDENT_INCR('TableName') - vrací označenou hodnotu inkrementu pole pro zadanou tabulku
SELECT IDENT_SEED('TableName') - vrací označenou hodnotu pole pro zadanou tabulku
Automaticky vrátí číslo posledního vloženého záznamu
VYBERTE IDENT_CURRENT('TableName')
Vraťte se k dalšímu automatickému číslu:
SELECT IDENT_CURRENT('TableName')+(SELECT IDENT_INCR('TableName'))
SELECT @@IDENTITY - Vrátí poslední označenou hodnotu, která byla vygenerována ve všech tabulkách aktuální relace
|