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.