Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Utilizzare NEWSEQUENTIALID() per creare un GUID incrementale in SQL Server

In SQL Server puoi utilizzare NEWSEQUENTIALID() funzione per creare valori univoci incrementali.

Crea un GUID (Globally Unique IDentifier) ​​maggiore di qualsiasi GUID precedentemente generato da questa funzione su un computer specificato dall'avvio del sistema operativo. Dopo aver riavviato il sistema operativo, il GUID può ricominciare da un intervallo inferiore, ma è ancora univoco a livello globale.

Il NEWSEQUENTIALID() la funzione può essere utilizzata solo con DEFAULT vincoli sulle colonne della tabella di tipo identificatore univoco . Pertanto, non puoi semplicemente eseguire una query come SELECT NEWSEQUENTIALID() e aspettarti che funzioni (ma tu puoi fallo con il NEWID() funzione).

Esempio 1 – Come valore PREDEFINITO

Ecco un rapido esempio per dimostrare come funziona:

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;

Risultato:

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

Nota che i GUID sono stati generati come parte del DEFAULT vincolo sul tavolo. Non sono stati forniti esplicitamente in INSERT dichiarazione.

Esempio 2 – Fornito esplicitamente nella dichiarazione INSERT

Ecco cosa succede se provi a utilizzare NEWSEQUENTIALID() nel tuo INSERT dichiarazione:

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

Risultato:

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.

Quindi deve far parte di un DEFAULT vincolo (come nell'esempio precedente).

Per inserire i dati di cui sopra, tutto ciò che dobbiamo fare è rimuovere la prima colonna da INSERT operazione:

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

SELECT * FROM Prisoner;

Risultato:

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

Esempio 3:utilizzato in un'istruzione SELECT

Riceverai lo stesso errore se provi a utilizzare questa funzione in un SELECT di base dichiarazione come questa:

SELECT NEWSEQUENTIALID();

Risultato:

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.

Sicurezza/Privacy

Si consiglia di non utilizzare NEWSEQUENTIALID() per i dati sensibili, perché è possibile indovinare il valore del successivo GUID generato e quindi accedere ai dati associati a quel GUID.