Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utilisez NEWSEQUENTIALID() pour créer un GUID incrémentiel dans SQL Server

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.