sql >> Database >  >> RDS >> Sqlserver

Gebruik NEWSEQUENTIALID() om een ​​oplopende GUID te maken in SQL Server

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.


  1. DROP-FUNCTIE zonder het aantal/type parameters te kennen?

  2. FOUT:Fout 1005:Kan tabel niet maken (fout:121)

  3. hoe selecteer je zelfs records uit een tabel in orakel?

  4. Hoe maak ik een opgeslagen procedure die optioneel in kolommen zal zoeken?