Dans SQL Server, vous pouvez utiliser le NEWSEQUENTIALID()
fonction pour créer des valeurs uniques incrémentielles.
Il crée un GUID (Globally Unique IDentifier) supérieur à tout GUID précédemment généré par cette fonction sur un ordinateur spécifié depuis le démarrage du système d'exploitation. Après le redémarrage du système d'exploitation, le GUID peut recommencer à partir d'une plage inférieure, mais reste globalement unique.
Le NEWSEQUENTIALID()
la fonction ne peut être utilisée qu'avec DEFAULT
contraintes sur les colonnes de table de type uniqueidentifier . Par conséquent, vous ne pouvez pas simplement exécuter une requête comme SELECT NEWSEQUENTIALID()
et attendez-vous à ce que cela fonctionne (mais vous pouvez faites cela avec le NEWID()
fonction).
Exemple 1 - En tant que valeur PAR DÉFAUT
Voici un exemple rapide pour montrer comment cela fonctionne :
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;
Résultat :
+--------------------------------------+-----------------+ | PrisonerId | PrisonerName | |--------------------------------------+-----------------| | a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld | | aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza | | b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes | +--------------------------------------+-----------------+
Notez que les GUID ont été générés dans le cadre du DEFAULT
contrainte sur la table. Ils n'étaient pas explicitement fournis dans le INSERT
déclaration.
Exemple 2 – Explicitement fourni dans l'instruction INSERT
Voici ce qui se passe si vous essayez d'utiliser NEWSEQUENTIALID()
dans votre INSERT
déclaration :
INSERT Prisoner (PrisonerId, PrisonerName) VALUES (NEWSEQUENTIALID(), 'Kramer');
Résultat :
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.
Il doit donc faire partie d'un DEFAULT
contrainte (comme dans l'exemple précédent).
Pour insérer les données ci-dessus, il suffit de supprimer la première colonne de INSERT
opération :
INSERT Prisoner (PrisonerName) VALUES ('Kramer'); SELECT * FROM Prisoner;
Résultat :
+--------------------------------------+-----------------+ | 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 | +--------------------------------------+-----------------+
Exemple 3 - Utilisé dans une instruction SELECT
Vous obtiendrez la même erreur si vous essayez d'utiliser cette fonction dans un SELECT
de base déclaration comme celle-ci :
SELECT NEWSEQUENTIALID();
Résultat :
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.
Sécurité/Confidentialité
Il est recommandé de ne pas utiliser NEWSEQUENTIALID()
pour les données sensibles, car il est possible de deviner la valeur du prochain GUID généré et donc d'accéder aux données associées à ce GUID.