Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden Sie NEWSEQUENTIALID(), um eine inkrementierende GUID in SQL Server zu erstellen

In SQL Server können Sie die NEWSEQUENTIALID() verwenden Funktion zum Erstellen inkrementeller eindeutiger Werte.

Es erstellt eine GUID (Globally Unique IDentifier), die größer ist als jede GUID, die zuvor von dieser Funktion auf einem bestimmten Computer seit dem Start des Betriebssystems generiert wurde. Nach einem Neustart des Betriebssystems kann die GUID wieder aus einem niedrigeren Bereich starten, ist aber dennoch global eindeutig.

Die NEWSEQUENTIALID() Funktion kann nur mit DEFAULT verwendet werden Einschränkungen für Tabellenspalten vom Typ uniqueidentifier . Daher können Sie nicht einfach eine Abfrage wie SELECT NEWSEQUENTIALID() ausführen und erwarten, dass es funktioniert (aber Sie können tun Sie das mit der NEWID() Funktion).

Beispiel 1 – Als STANDARD-Wert

Hier ist ein kurzes Beispiel, um zu demonstrieren, wie es funktioniert:

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;

Ergebnis:

+--------------------------------------+-----------------+
| PrisonerId                           | PrisonerName    |
|--------------------------------------+-----------------|
| a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld  |
| aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza |
| b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes    |
+--------------------------------------+-----------------+

Beachten Sie, dass die GUIDs als Teil von DEFAULT generiert wurden Einschränkung auf dem Tisch. Sie wurden im INSERT nicht explizit bereitgestellt Aussage.

Beispiel 2 – Explizit in der INSERT-Anweisung bereitgestellt

Folgendes passiert, wenn Sie versuchen, NEWSEQUENTIALID() zu verwenden in Ihrem INSERT Aussage:

INSERT Prisoner (PrisonerId, PrisonerName)
VALUES (NEWSEQUENTIALID(), 'Kramer');

Ergebnis:

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.

Also muss es Teil eines DEFAULT sein Einschränkung (wie im vorherigen Beispiel).

Um die obigen Daten einzufügen, müssen wir lediglich die erste Spalte aus INSERT entfernen Betrieb:

INSERT Prisoner (PrisonerName)
VALUES ('Kramer');

SELECT * FROM Prisoner;

Ergebnis:

+--------------------------------------+-----------------+
| 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          |
+--------------------------------------+-----------------+

Beispiel 3 – Verwendung in einer SELECT-Anweisung

Sie erhalten denselben Fehler, wenn Sie versuchen, diese Funktion in einem einfachen SELECT zu verwenden Anweisung wie diese:

SELECT NEWSEQUENTIALID();

Ergebnis:

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.

Sicherheit/Datenschutz

Es wird empfohlen, NEWSEQUENTIALID() nicht zu verwenden für vertrauliche Daten, da es möglich ist, den Wert der nächsten generierten GUID zu erraten und daher auf Daten zuzugreifen, die dieser GUID zugeordnet sind.