I SQL Server kan du använda NEWSEQUENTIALID()
funktion för att skapa inkrementella unika värden.
Den skapar en GUID (Globally Unique IDentifier) som är större än någon GUID som tidigare genererats av den här funktionen på en specificerad dator sedan operativsystemet startades. Efter att ha startat om operativsystemet kan GUID:n starta om från ett lägre intervall, men är fortfarande globalt unikt.
NEWSEQUENTIALID()
funktionen kan endast användas med DEFAULT
begränsningar på tabellkolumner av typen uniqueidentifier . Därför kan du inte bara köra en fråga som SELECT NEWSEQUENTIALID()
och förvänta dig att det fungerar (men du kan). gör det med NEWID()
funktion).
Exempel 1 – Som ett DEFAULT-värde
Här är ett snabbt exempel för att visa hur det fungerar:
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 | +--------------------------------------+-----------------+
Observera att GUID:erna genererades som en del av DEFAULT
begränsning på bordet. De angavs inte uttryckligen i INSERT
uttalande.
Exempel 2 – Anges uttryckligen i INSERT-utlåtandet
Här är vad som händer om du försöker använda NEWSEQUENTIALID()
i din INSERT
uttalande:
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 måste vara en del av en DEFAULT
begränsning (som i föregående exempel).
För att infoga ovanstående data behöver vi bara ta bort den första kolumnen från 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 | +--------------------------------------+-----------------+
Exempel 3 – Används i en SELECT-sats
Du kommer att få samma felmeddelande om du försöker använda den här funktionen i en grundläggande SELECT
uttalande så här:
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.
Säkerhet/sekretess
Det rekommenderas att inte använda NEWSEQUENTIALID()
för känslig data, eftersom det är möjligt att gissa värdet på nästa genererade GUID och därför få tillgång till data som är kopplade till det GUID.