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.