V SQL Server můžete použít NEWSEQUENTIALID()
funkce k vytvoření přírůstkových jedinečných hodnot.
Vytvoří GUID (globálně jedinečný identifikátor), který je větší než kterýkoli GUID dříve vygenerovaný touto funkcí na určeném počítači od spuštění operačního systému. Po restartování operačního systému může GUID začít znovu z nižšího rozsahu, ale stále je celosvětově jedinečné.
NEWSEQUENTIALID()
funkci lze použít pouze s DEFAULT
omezení na sloupce tabulky typu uniqueidentifier . Proto nemůžete pouze spustit dotaz jako SELECT NEWSEQUENTIALID()
a očekávat, že to bude fungovat (ale můžete udělejte to pomocí NEWID()
funkce).
Příklad 1 – Jako VÝCHOZÍ hodnota
Zde je rychlý příklad demonstrující, jak to funguje:
USE Test; CREATE TABLE Prisoner ( PrisonerId uniqueidentifier NOT NULL DEFAULT NEWSEQUENTIALID(), PrisonerName varchar(70) NOT NULL, ); INSERT Prisoner (PrisonerName) VALUES ('Jerry Seinfeld'), ('George Costanza'), ('Elaine Benes'); SELECT * FROM Prisoner;
Výsledek:
+--------------------------------------+-----------------+ | PrisonerId | PrisonerName | |--------------------------------------+-----------------| | a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld | | aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza | | b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes | +--------------------------------------+-----------------+
Všimněte si, že GUID byly vygenerovány jako součást DEFAULT
omezení na stole. Nebyly výslovně uvedeny v INSERT
prohlášení.
Příklad 2 – Explicitně uveden v příkazu INSERT
Zde je to, co se stane, když se pokusíte použít NEWSEQUENTIALID()
ve vašem INSERT
prohlášení:
INSERT Prisoner (PrisonerId, PrisonerName) VALUES (NEWSEQUENTIALID(), 'Kramer');
Výsledek:
Msg 302, Level 16, State 0, Line 1 The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression.
Musí tedy být součástí DEFAULT
omezení (jako v předchozím příkladu).
K vložení výše uvedených dat stačí odstranit první sloupec z INSERT
operace:
INSERT Prisoner (PrisonerName) VALUES ('Kramer'); SELECT * FROM Prisoner;
Výsledek:
+--------------------------------------+-----------------+ | PrisonerId | PrisonerName | |--------------------------------------+-----------------| | a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld | | aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza | | b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes | | b76d433e-f36b-1410-8a80-007d2b533547 | Kramer | +--------------------------------------+-----------------+
Příklad 3 – Používá se v příkazu SELECT
Pokud se pokusíte použít tuto funkci v základním SELECT
, dostanete stejnou chybu prohlášení jako toto:
SELECT NEWSEQUENTIALID();
Výsledek:
Msg 302, Level 16, State 0, Line 1 The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression.
Zabezpečení/Soukromí
Nedoporučuje se používat NEWSEQUENTIALID()
pro citlivá data, protože je možné odhadnout hodnotu dalšího vygenerovaného GUID, a tudíž získat přístup k datům spojeným s tímto GUID.