Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Instancia
administrada de Azure SQLBase de datos SQL en Microsoft Fabric
Crea un objeto de secuencia y especifica sus propiedades. Una secuencia es un objeto enlazado a un esquema definido por el usuario que genera una secuencia de valores numéricos según la especificación con la que se creó la secuencia. La secuencia de valores numéricos se genera en orden ascendente o descendente en un intervalo definido y se puede configurar para reiniciarse (en un ciclo) cuando se agota.
Las secuencias, a diferencia de las columnas de identidad, no están asociadas a tablas específicas. Las aplicaciones hacen referencia a un objeto de secuencia para recuperar su valor siguiente. La aplicación controla la relación entre las secuencias y tablas. Las aplicaciones de usuario pueden hacer referencia un objeto de secuencia y coordinar los valores a través de varias filas y tablas.
A diferencia de los valores de las columnas de identidad que se generan cuando se insertan filas, una aplicación puede obtener el siguiente número de secuencia sin insertar la fila llamando a NEXT VALUE FOR. Use sp_sequence_get_range para obtener varios números de secuencia a la vez.
Para obtener información y escenarios que usan y CREATE SEQUENCE la NEXT VALUE FOR función, vea Números de secuencia.
Convenciones de sintaxis de Transact-SQL
Sintaxis
CREATE SEQUENCE [ schema_name . ] sequence_name
[ AS [ built_in_integer_type | user-defined_integer_type ] ]
[ START WITH <constant> ]
[ INCREMENT BY <constant> ]
[ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]
[ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]
[ CYCLE | { NO CYCLE } ]
[ { CACHE [ <constant> ] } | { NO CACHE } ]
[ ; ]
Argumentos
sequence_name
Especifica el nombre exclusivo por el que se conoce la secuencia en la base de datos. El tipo es sysname.
[ built_in_integer_type | usuario-defined_integer_type ]
Una secuencia se puede definir como de cualquier tipo entero. Están permitidos los siguientes tipos
- tinyint: abarca de 0 a 255
- smallint: abarca de -32 768 a 32 767
- int: abarca de -2 147 483 648 a 2 147 483 647
- bigint: abarca de -9 223 372 036 854 775 808 a 9 223 372 036 854 775 807
- decimal y numeric con una escala de 0.
- Cualquier tipo de datos definido por el usuario (tipo de alias) que esté basado en uno de los tipos permitidos.
Si no se proporciona ningún tipo de datos, el tipo de datos bigint se usa como valor predeterminado.
START WITH <(constante)>
Primer valor devuelto por el objeto de secuencia. El START valor debe ser un valor menor o igual que el máximo y mayor o igual que el valor mínimo del objeto de secuencia. El valor inicial predeterminado para un nuevo objeto de secuencia es el valor mínimo para un objeto de secuencia ascendente y el valor máximo para uno descendente.
INCREMENT BY <(constante)>
Valor utilizado para incrementar (o disminuir si es negativo) el valor del objeto de secuencia para cada llamada a la NEXT VALUE FOR función. Si el incremento es un valor negativo, el objeto de secuencia es descendente; de lo contrario, es ascendente. El incremento no puede ser 0. El incremento predeterminado para un nuevo objeto de secuencia es 1.
[ Constante< MINVALUE >| NO MINVALUE ]
Especifica los límites del objeto de secuencia. El valor mínimo predeterminado para un nuevo objeto de secuencia es el valor mínimo del tipo de datos del objeto de secuencia. Es cero para el tipo de datos tinyint y un número negativo para todos los demás.
[ constante< MAXVALUE >| NO MAXVALUE
Especifica los límites del objeto de secuencia. El valor máximo predeterminado para un nuevo objeto de secuencia es el valor máximo del tipo de datos del objeto de secuencia.
[ CICLO | SIN CICLO ]
Propiedad especifica si el objeto de secuencia se debería reiniciar desde el valor mínimo (o el máximo para los objetos de secuencia descendente) o producir una excepción cuando se supera el valor mínimo o máximo. La opción de ciclo predeterminado para los nuevos objetos de secuencia es NO CYCLE.
Nota
El ciclo de un SEQUENCE reinicio se reinicia desde el valor mínimo o máximo, no desde el valor inicial.
[ CACHE [ <constante> ] | SIN CACHE ]
Aumenta el rendimiento de las aplicaciones que utilizan objetos de secuencia al reducir el número de E/S de disco que se necesitan para generar números de secuencia. Tiene como valor predeterminado CACHE.
Por ejemplo, si se elige un tamaño de caché de 50, SQL Server no mantiene 50 valores individuales almacenados en caché. Solo almacena en caché el valor actual y la cantidad de valores que quedan en la memoria caché. Esto significa que la cantidad de memoria necesaria para almacenar la memoria caché siempre es dos veces la del tipo de datos del objeto de secuencia.
Nota
Si la opción de caché está habilitada sin especificar un tamaño de caché, el motor de base de datos selecciona un tamaño. Sin embargo, los usuarios no deben confiar en que la selección sea coherente. Microsoft puede cambiar el método de cálculo del tamaño de la memoria caché sin previo aviso.
Cuando se crea con la CACHE opción , un apagado inesperado (por ejemplo, un error de energía) puede dar lugar a la pérdida de números de secuencia restantes en la memoria caché.
Observaciones
Los números de secuencia se generan fuera del ámbito de la transacción actual. Se consumen si la transacción que usa el número de secuencia se confirma o se revierte. La validación de duplicados solo se produce una vez que un registro está totalmente relleno. Esto puede dar lugar a casos en que se use el mismo número para más de un registro durante la creación, pero luego se identifique como un duplicado. Si ocurre esto y se han aplicado otros valores autonuméricos a registros posteriores, esto puede dar lugar a una discrepancia entre los valores autonuméricos y su comportamiento esperado.
Administración de la memoria caché
Para mejorar el rendimiento, SQL Server preasigna el número de números de secuencia especificados por el CACHE argumento .
Por ejemplo, imagine que se crea una secuencia nueva con el valor inicial 1 y 15 como tamaño de caché. Cuando se necesita el primer valor, están disponibles los valores 1 a 15 de la memoria. El último valor almacenado en memoria caché (15) se escribe en las tablas del sistema del disco. Cuando se utilizan los 15 números, la solicitud siguiente (la del número 16) hará que la memoria caché sea asignada de nuevo. El nuevo último valor almacenado en caché (30) se escribe en las tablas del sistema.
Si el Motor de base datos se detiene después de usar 22 números, el siguiente número de secuencia en memoria (23) se escribe en las tablas del sistema, reemplazando el número almacenado previamente.
Una vez que SQL Server se reinicia y se necesita un número de secuencia, el número inicial se lee en las tablas del sistema (23). La cantidad de memoria caché de 15 números (23-38) se asigna a la memoria y el siguiente número que no está en memoria caché (39) se escribe en las tablas del sistema.
Si el Motor de base datos se detiene de modo anómalo por un suceso como un error de alimentación, la secuencia se reinicia con el número leído de las tablas del sistema (39). Se pierden los números de secuencia asignados a la memoria (que nunca fueran solicitados por un usuario o aplicación). Esta funcionalidad podría dejar huecos, pero garantiza que el mismo valor nunca se emitirá dos veces para un único objeto de secuencia a menos que se defina como CYCLE o se reinicie manualmente.
La memoria caché se mantiene en memoria mediante el seguimiento del valor actual (el último valor emitido) y la cantidad de valores que quedan en la memoria caché. Por consiguiente, la cantidad de memoria que la memoria caché usa siempre es dos veces la del tipo de datos del objeto de secuencia.
Al establecer el argumento de caché para NO CACHE escribir el valor de secuencia actual en las tablas del sistema cada vez que se usa una secuencia. Esto puede ralentizar el rendimiento al aumentar el acceso al disco, pero reduce la posibilidad de que se produzcan huecos imprevistos. Las brechas pueden producirse si se solicitan números mediante las NEXT VALUE FOR funciones o sp_sequence_get_range , pero los números no se usan o se usan en transacciones no confirmadas.
Cuando un objeto de secuencia usa la CACHE opción , si reinicia el objeto de secuencia o modifica las INCREMENTpropiedades de tamaño de caché , CYCLEMINVALUE, MAXVALUE, o , hará que la memoria caché se escriba en las tablas del sistema antes de que se produzca el cambio. A continuación, la memoria caché se vuelve a cargar a partir del valor actual (es decir, no se omite ningún número). El cambio realizado en el tamaño de la memoria caché surte efecto de forma inmediata.
Opción CACHE cuando los valores almacenados en caché están disponibles
El siguiente proceso se produce cada vez que se solicita que un objeto de secuencia genere el siguiente valor para la CACHE opción si hay valores no utilizados disponibles en la memoria caché en memoria para el objeto de secuencia.
- Se calcula el valor siguiente para el objeto de secuencia.
- El nuevo valor actual para el objeto de secuencia se actualiza en la memoria.
- El valor calculado se devuelve a la instrucción que realiza la llamada.
Opción CACHE cuando se agota la memoria caché
El siguiente proceso se produce cada vez que se solicita un objeto de secuencia para generar el siguiente valor para la CACHE opción si se agota la memoria caché:
Se calcula el valor siguiente para el objeto de secuencia.
Se calcula el último valor para la nueva memoria caché.
Se bloquea la fila de la tabla del sistema para el objeto de secuencia y el valor calculado en el paso 2 (el último valor) se escribe en la tabla del sistema. Se desencadena un evento extendido agotado por caché para notificar al usuario el nuevo valor persistente.
Opción NO CACHE
El siguiente proceso se produce cada vez que se solicita un objeto de secuencia para generar el siguiente valor para la NO CACHE opción :
- Se calcula el valor siguiente para el objeto de secuencia.
- El nuevo valor actual para el objeto de secuencia se escribe en la tabla del sistema.
- El valor calculado se devuelve a la instrucción que realiza la llamada.
Metadatos
Para obtener información sobre las secuencias, consulte sys.sequences.
Seguridad
Permisos
Requiere CREATE SEQUENCEel permiso , ALTERo CONTROL en .SCHEMA
- Los miembros del db_owner y db_ddladmin roles fijos de base de datos pueden crear, modificar y quitar objetos de secuencia.
- Los miembros del db_owner y db_datawriter roles fijos de base de datos pueden actualizar los objetos de secuencia haciendo que generen números.
En el ejemplo siguiente se concede al usuario AdventureWorks\Larry permiso para crear secuencias en el Test esquema.
GRANT CREATE SEQUENCE
ON SCHEMA::Test TO [AdventureWorks\Larry];
La propiedad de un objeto de secuencia se puede transferir mediante la ALTER AUTHORIZATION instrucción .
Si una secuencia usa un tipo de datos definido por el usuario, el creador de la secuencia debe tener REFERENCES permiso en el tipo.
Auditoría
Para auditar CREATE SEQUENCE, supervise .SCHEMA_OBJECT_CHANGE_GROUP
Ejemplos
Para obtener ejemplos de cómo crear secuencias y usar la NEXT VALUE FOR función para generar números de secuencia, consulte Números de secuencia.
En la mayoría de estos ejemplos se crean objetos de secuencia en un esquema denominado Test.
Para crear el esquema Test, ejecute la siguiente instrucción.
CREATE SCHEMA Test;
GO
A. Crear una secuencia que aumente en 1
En el ejemplo siguiente, Thierry crea una secuencia denominada CountBy1 que aumenta en uno cada vez que se usa.
CREATE SEQUENCE Test.CountBy1
START WITH 1
INCREMENT BY 1;
GO
B. Crear una secuencia que disminuya en 1
En el ejemplo siguiente se inicia en 0 y se cuenta en números negativos por uno cada vez que se usa.
CREATE SEQUENCE Test.CountByNeg1
START WITH 0
INCREMENT BY -1;
GO
C. Crear una secuencia que aumente en 5
En el ejemplo siguiente se crea una secuencia que aumenta en 5 cada vez que se usa.
CREATE SEQUENCE Test.CountBy1
START WITH 5
INCREMENT BY 5;
GO
D. Crear una secuencia que comience con un número designado
Después de importar una tabla, Thierry observa que el mayor número de identificación utilizado es 24.328. Thierry necesita una secuencia que genere números a partir de 24.329. El siguiente código crea una secuencia que comienza en 24.329 y se incrementa en 1.
CREATE SEQUENCE Test.ID_Seq
START WITH 24329
INCREMENT BY 1;
GO
E. Creación de una secuencia con valores predeterminados
En el siguiente ejemplo se crea una secuencia mediante los valores predeterminados.
CREATE SEQUENCE Test.TestSequence;
Ejecute la siguiente instrucción para ver las propiedades de la secuencia.
SELECT *
FROM sys.sequences
WHERE name = 'TestSequence';
Una lista parcial del resultado demuestra los valores predeterminados.
| Output | Valor predeterminado |
|---|---|
start_value |
-9223372036854775808 |
increment |
1 |
minimum_value |
-9223372036854775808 |
maximum_value |
9223372036854775807 |
is_cycling |
0 |
is_cached |
1 |
current_value |
-9223372036854775808 |
F. Creación de una secuencia con un tipo de datos específico
En este ejemplo se crea una secuencia usando el tipo de datos smallint, que abarca de -32 768 a 32 767.
CREATE SEQUENCE SmallSeq
AS SMALLINT;
G. Creación de una secuencia con todos los argumentos
En este ejemplo se crea una secuencia denominada DecSeq mediante el tipo de datos decimal, que abarca de 0 a 255. La secuencia se inicia con 125 y se incrementa en 25 cada vez que se genera un número. Dado que la secuencia se configura para recorrer en ciclo cuando el valor supera el valor máximo de 200, la secuencia se reinicia en el valor mínimo de 100.
CREATE SEQUENCE Test.DecSeq
AS DECIMAL (3, 0)
START WITH 125
INCREMENT BY 25
MINVALUE 100
MAXVALUE 200
CYCLE
CACHE 3;
Ejecute la siguiente instrucción para ver el primer valor; la opción START WITH 125.
SELECT NEXT VALUE FOR Test.DecSeq;
Ejecute la instrucción tres veces más para devolver 150, 175 y 200.
Ejecute la instrucción para ver de nuevo cómo vuelve el valor inicial a la opción MINVALUE 100.
Ejecute el siguiente código para confirmar el tamaño de caché y ver el valor actual.
SELECT cache_size, current_value
FROM sys.sequences
WHERE name = 'DecSeq';