In SQL Server kunt u de NEWSEQUENTIALID()
. gebruiken functie om incrementele unieke waarden te creëren.
Het creëert een GUID (Globally Unique IDentifier) die groter is dan alle GUID's die eerder door deze functie op een gespecificeerde computer zijn gegenereerd sinds het besturingssysteem is gestart. Na het herstarten van het besturingssysteem kan de GUID opnieuw starten vanaf een lager bereik, maar is nog steeds wereldwijd uniek.
De NEWSEQUENTIALID()
functie kan alleen worden gebruikt met DEFAULT
beperkingen op tabelkolommen van het type uniqueidentifier . Daarom kunt u niet zomaar een zoekopdracht uitvoeren zoals SELECT NEWSEQUENTIALID()
en verwacht dat het werkt (maar u kunt doe dat met de NEWID()
functie).
Voorbeeld 1 – Als STANDAARD Waarde
Hier is een snel voorbeeld om te demonstreren hoe het werkt:
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;
Resultaat:
+--------------------------------------+-----------------+ | PrisonerId | PrisonerName | |--------------------------------------+-----------------| | a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld | | aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza | | b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes | +--------------------------------------+-----------------+
Merk op dat de GUID's werden gegenereerd als onderdeel van de DEFAULT
beperking op tafel. Ze werden niet expliciet vermeld in de INSERT
verklaring.
Voorbeeld 2 – Expliciet vermeld in de INSERT-instructie
Dit gebeurt er als je NEWSEQUENTIALID()
probeert te gebruiken in uw INSERT
verklaring:
INSERT Prisoner (PrisonerId, PrisonerName) VALUES (NEWSEQUENTIALID(), 'Kramer');
Resultaat:
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.
Het moet dus deel uitmaken van een DEFAULT
beperking (zoals in het vorige voorbeeld).
Om de bovenstaande gegevens in te voegen, hoeven we alleen de eerste kolom te verwijderen uit de INSERT
bediening:
INSERT Prisoner (PrisonerName) VALUES ('Kramer'); SELECT * FROM Prisoner;
Resultaat:
+--------------------------------------+-----------------+ | 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 | +--------------------------------------+-----------------+
Voorbeeld 3 – Gebruikt in een SELECT-instructie
Je krijgt dezelfde foutmelding als je deze functie probeert te gebruiken in een standaard SELECT
verklaring als deze:
SELECT NEWSEQUENTIALID();
Resultaat:
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.
Beveiliging/Privacy
Het wordt aanbevolen om NEWSEQUENTIALID()
. niet te gebruiken voor gevoelige gegevens, omdat het mogelijk is om de waarde van de volgende gegenereerde GUID te raden en daarom toegang te krijgen tot gegevens die aan die GUID zijn gekoppeld.