sql >> Base de Datos >  >> RDS >> Sqlserver

Use NEWSEQUENTIALID() para crear un GUID incremental en SQL Server

En SQL Server, puede usar NEWSEQUENTIALID() función para crear valores únicos incrementales.

Crea un GUID (Globally Unique IDentifier) ​​que es mayor que cualquier GUID generado previamente por esta función en una computadora específica desde que se inició el sistema operativo. Después de reiniciar el sistema operativo, el GUID puede comenzar de nuevo desde un rango más bajo, pero aún es globalmente único.

El NEWSEQUENTIALID() La función solo se puede usar con DEFAULT restricciones en las columnas de la tabla de tipo uniqueidentifier . Por lo tanto, no puede simplemente ejecutar una consulta como SELECT NEWSEQUENTIALID() y esperar que funcione (pero puede haz eso con NEWID() función).

Ejemplo 1:como valor predeterminado

He aquí un ejemplo rápido para demostrar cómo funciona:

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;

Resultado:

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

Tenga en cuenta que los GUID se generaron como parte del DEFAULT restricción sobre la mesa. No se proporcionaron explícitamente en el INSERT declaración.

Ejemplo 2:proporcionado explícitamente en la instrucción INSERT

Esto es lo que sucede si intentas usar NEWSEQUENTIALID() en tu INSERT declaración:

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

Resultado:

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.

Por lo tanto, debe ser parte de un DEFAULT restricción (como en el ejemplo anterior).

Para insertar los datos anteriores, todo lo que tenemos que hacer es eliminar la primera columna de INSERT operación:

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

SELECT * FROM Prisoner;

Resultado:

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

Ejemplo 3:utilizado en una instrucción SELECT

Obtendrá el mismo error si intenta usar esta función en un SELECT básico declaración como esta:

SELECT NEWSEQUENTIALID();

Resultado:

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.

Seguridad/Privacidad

Se recomienda no usar NEWSEQUENTIALID() para datos confidenciales, porque es posible adivinar el valor del siguiente GUID generado y, por lo tanto, acceder a los datos asociados con ese GUID.