I SQL Server kan du bruge NEWSEQUENTIALID()
funktion til at skabe trinvise unikke værdier.
Den opretter en GUID (Globally Unique IDentifier), der er større end nogen GUID, der tidligere er genereret af denne funktion på en specificeret computer, siden operativsystemet blev startet. Efter genstart af operativsystemet kan GUID'et starte igen fra et lavere område, men det er stadig globalt unikt.
NEWSEQUENTIALID()
funktionen kan kun bruges med DEFAULT
begrænsninger på tabelkolonner af typen uniqueidentifier . Derfor kan du ikke bare køre en forespørgsel som SELECT NEWSEQUENTIALID()
og forventer, at det virker (men du kan). gør det med NEWID()
funktion).
Eksempel 1 – Som STANDARDværdi
Her er et hurtigt eksempel for at demonstrere, hvordan det virker:
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;
Resultat:
+--------------------------------------+-----------------+ | PrisonerId | PrisonerName | |--------------------------------------+-----------------| | a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld | | aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza | | b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes | +--------------------------------------+-----------------+
Bemærk, at GUID'erne blev genereret som en del af DEFAULT
begrænsning på bordet. De var ikke eksplicit angivet i INSERT
erklæring.
Eksempel 2 – Eksplicit angivet i INSERT-erklæringen
Her er, hvad der sker, hvis du prøver at bruge NEWSEQUENTIALID()
i din INSERT
erklæring:
INSERT Prisoner (PrisonerId, PrisonerName) VALUES (NEWSEQUENTIALID(), 'Kramer');
Resultat:
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.
Så det skal være en del af en DEFAULT
begrænsning (som i det foregående eksempel).
For at indsætte ovenstående data skal vi bare fjerne den første kolonne fra INSERT
operation:
INSERT Prisoner (PrisonerName) VALUES ('Kramer'); SELECT * FROM Prisoner;
Resultat:
+--------------------------------------+-----------------+ | 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 | +--------------------------------------+-----------------+
Eksempel 3 – Brugt i en SELECT-erklæring
Du får den samme fejl, hvis du prøver at bruge denne funktion i en grundlæggende SELECT
udsagn som denne:
SELECT NEWSEQUENTIALID();
Resultat:
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.
Sikkerhed/fortrolighed
Det anbefales ikke at bruge NEWSEQUENTIALID()
for følsomme data, fordi det er muligt at gætte værdien af det næste genererede GUID og derfor få adgang til data, der er knyttet til det GUID.