- 04/11/2017
- 10 minutes to read
-
- W
- c
- r
- M
- m
-
+7
Applies to: SQL Server (all supported versions) Azure SQL Database
Creates a sequence object and specifies its properties. Una secuencia es un objeto enlazado a esquema definido por el usuario que genera una secuencia de valores numéricos de acuerdo con 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 reiniciar (ciclo) cuando se agota. Las secuencias, a diferencia de las columnas de identidad, no están asociadas con tablas específicas. Las aplicaciones se refieren a un objeto de secuencia para recuperar su siguiente valor. La relación entre secuencias y tablas es controlada por la aplicación. Las aplicaciones de usuario pueden hacer referencia a un objeto de secuencia y coordinar los valores en varias filas y tablas.
A diferencia de los valores de 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 la función 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 utilizan CREAR SECUENCIA y el SIGUIENTE VALOR PARA la función, consulte Números de secuencia.
Convenciones de sintaxis de Transact-SQL
Sintaxis
CREATE SEQUENCE sequence_name ] } | { NO MINVALUE } ] } | { NO MAXVALUE } ] } | { NO CACHE } ]
Nota
Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte la documentación de versiones anteriores.
Argumentos
sequence_name
Especifica el nombre único por el que se conoce la secuencia en la base de datos. Type es sysname.
Especifica los límites para el 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. Esto es cero para el tipo de datos tinyint y un número negativo para todos los demás tipos de datos.Propiedad
que especifica si el objeto de secuencia debe reiniciarse desde el valor mínimo (o máximo para los objetos de secuencia descendente) o lanzar una excepción cuando se excede su valor mínimo o máximo. La opción de ciclo predeterminada para los nuevos objetos de secuencia es SIN CICLO.
Nota
Ciclismo una SECUENCIA se reinicia desde el valor mínimo o máximo, no desde el valor de inicio.
/ SIN CACHÉ]
Aumenta el rendimiento de las aplicaciones que utilizan objetos de secuencia al minimizar el número de discos iOS necesarios para generar números de secuencia. El valor predeterminado es CACHÉ.
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 el número de valores que quedan en la caché. Esto significa que la cantidad de memoria necesaria para almacenar la caché es siempre dos instancias del tipo de datos del objeto de secuencia.
Nota
Si la opción caché está habilitada sin especificar un tamaño de caché, el Motor de base de datos seleccionará un tamaño. Sin embargo, los usuarios no deben confiar en que la selección sea consistente. Microsoft podría cambiar el método de cálculo del tamaño de la caché sin previo aviso.
Cuando se crea con la opción CACHÉ, un apagado inesperado (como un corte de energía) puede provocar la pérdida de números de secuencia restantes en la caché.
Observaciones generales
Los números de secuencia se generan fuera del alcance de la transacción actual. Se consumen tanto si la transacción que utiliza el número de secuencia se confirma como si se revierte. La validación de duplicados solo se produce una vez que un registro está completamente rellenado. Esto puede resultar en algunos casos en los que el mismo número se usa para más de un registro durante la creación, pero luego se identifica como un duplicado. Si esto ocurre y se han aplicado otros valores de autonúmero a registros posteriores, esto puede dar lugar a un espacio entre los valores de autonúmero y el comportamiento esperado.
Administración de caché
Para mejorar el rendimiento, SQL Server asigna previamente el número de números de secuencia especificados por el argumento CACHÉ.
Por ejemplo, se crea una nueva secuencia con un valor inicial de 1 y un tamaño de caché de 15. Cuando se necesita el primer valor, los valores del 1 al 15 se ponen a disposición de la memoria. El último valor en caché (15) se escribe en las tablas del sistema en el disco. Cuando se utilizan los 15 números, la siguiente solicitud (para el número 16) hará que la caché se asigne de nuevo. El nuevo último valor en caché (30) se escribirá en las tablas del sistema.
Si el Motor de la base de datos se detiene después de usar 22 números, el siguiente número de secuencia previsto en la memoria (23) se escribe en las tablas del sistema, reemplazando el número almacenado anteriormente.
Después de 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 caché de 15 números (23-38) se asigna a la memoria y el siguiente número que no es caché (39) se escribe en las tablas del sistema.
Si el motor de la base de datos se detiene de forma anormal por un evento como un corte de energía, la secuencia se reinicia con el número leído de las tablas del sistema (39). Cualquier número de secuencia asignado a la memoria (pero nunca solicitado por un usuario o aplicación) se pierde. Esta funcionalidad puede 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 CICLO o se reinicie manualmente.
La caché se mantiene en memoria rastreando el valor actual (el último valor emitido) y el número de valores que quedan en la caché. Por lo tanto, la cantidad de memoria utilizada por la caché es siempre dos instancias del tipo de datos del objeto de secuencia.
Establecer el argumento cache en NO CACHE escribe el valor de secuencia actual en las tablas del sistema cada vez que se utiliza una secuencia. Esto podría ralentizar el rendimiento al aumentar el acceso al disco, pero reduce la posibilidad de brechas no deseadas. Las brechas pueden ocurrir si se solicitan números usando el SIGUIENTE VALOR PARA o las funciones sp_sequence_get_range, pero luego los números no se usan o se usan en transacciones sin confirmar.
Cuando un objeto de secuencia utiliza la opción CACHÉ, si reinicia el objeto de secuencia o altera las propiedades INCREMENTO, CICLO, MINVALUE, MAXVALUE o tamaño de la caché, hará que la caché se escriba en las tablas del sistema antes de que se produzca el cambio. A continuación, la caché se vuelve a cargar a partir del valor actual (es decir, no se omiten números). Cambiar el tamaño de la caché tiene efecto de inmediato.
Opción de CACHÉ cuando los valores almacenados en caché están disponibles
El siguiente proceso se produce cada vez que se solicita a un objeto de secuencia que genere el siguiente valor para la opción de CACHÉ si hay valores no utilizados disponibles en la caché en memoria para el objeto de secuencia.
-
Se calcula el siguiente valor para el objeto de secuencia.
-
El nuevo valor actual del objeto de secuencia se actualiza en memoria.
-
El valor calculado se devuelve a la instrucción de llamada.
Opción de CACHÉ cuando la caché se agota
El siguiente proceso se produce cada vez que se solicita a un objeto de secuencia que genere el siguiente valor para la opción de CACHÉ si la caché se ha agotado:
-
Se calcula el siguiente valor para el objeto de secuencia.
-
El último valor de la nueva caché se calcula.
-
La fila de la tabla del sistema para el objeto de secuencia está bloqueada y el valor calculado en el paso 2 (el último valor) se escribe en la tabla del sistema. Se activa un xevent agotado en caché para notificar al usuario del nuevo valor persistido.
Opción SIN CACHÉ
El siguiente proceso se produce cada vez que se solicita a un objeto de secuencia que genere el siguiente valor para la opción SIN CACHÉ:
-
Se calcula el siguiente valor para el objeto de secuencia.
-
El nuevo valor actual del objeto sequence se escribe en la tabla system.
-
El valor calculado se devuelve a la instrucción de llamada.
Metadatos
Para obtener información sobre secuencias, consulte sys.secuencia.
Seguridad
Permisos
Requiere los permisos CREAR SECUENCIA, ALTERAR o CONTROLAR en el ESQUEMA.
-
Los miembros de los roles fijos de base de datos db_owner y db_ddladmin pueden crear, modificar y soltar objetos de secuencia.
-
Los miembros de los roles fijos de base de datos db_owner y db_datawriter pueden actualizar objetos de secuencia haciendo que generen números.
El siguiente ejemplo otorga al usuario el permiso AdventureWorks\Larry para crear secuencias en el esquema de prueba.
GRANT CREATE SEQUENCE ON SCHEMA::Test TO
La propiedad de un objeto de secuencia se puede transferir mediante la instrucción ALTER AUTHORIZATION.
Si una secuencia utiliza un tipo de datos definido por el usuario, el creador de la secuencia debe tener permiso de REFERENCIAS en el tipo.
Audit
Para auditar LA SECUENCIA DE CREACIÓN, supervise el GRUPO SCHEMA_OBJECT_CHANGE_GROUP.
Ejemplos
Para obtener ejemplos de creación de secuencias y uso del SIGUIENTE VALOR PARA la función para generar números de secuencia, consulte Números de secuencia.
La mayoría de los ejemplos siguientes crean objetos de secuencia en un esquema llamado Test.
Para crear el esquema de prueba, ejecute la siguiente instrucción.
CREATE SCHEMA Test ; GO
A. Creación de una secuencia que aumenta en 1
En el siguiente ejemplo, Thierry crea una secuencia llamada CountBy1 que aumenta en uno cada vez que se usa.
CREATE SEQUENCE Test.CountBy1 START WITH 1 INCREMENT BY 1 ; GO
B. Creación de una secuencia que disminuye en 1
El siguiente ejemplo comienza en 0 y cuenta en números negativos en uno cada vez que se usa.
CREATE SEQUENCE Test.CountByNeg1 START WITH 0 INCREMENT BY -1 ; GO
C. Creación de una secuencia que aumenta en 5
El siguiente ejemplo crea una secuencia que aumenta en 5 cada vez que se usa.
CREATE SEQUENCE Test.CountBy1 START WITH 5 INCREMENT BY 5 ; GO
D. Creando una secuencia que comienza con un número designado
Después de importar una tabla, Thierry nota que el número de identificación más alto 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 con 24.329 e incrementa en 1.
CREATE SEQUENCE Test.ID_Seq START WITH 24329 INCREMENT BY 1 ; GO
E. Crear una secuencia utilizando valores predeterminados
El siguiente ejemplo crea una secuencia utilizando 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 de la salida muestra los valores predeterminados.
Output | Default value |
---|---|
start_value |
-9223372036854775808 |
increment |
1 |
mimimum_value |
-9223372036854775808 |
maximum_value |
9223372036854775807 |
is_cycling |
0 |
is_cached |
1 |
current_value |
-9223372036854775808 |
F. Crear una secuencia con un tipo de datos específico
El siguiente ejemplo se crea una secuencia mediante la smallint tipo de datos, con un rango de -32,768 a 32,767.
CREATE SEQUENCE SmallSeq AS smallint ;
G. Creación de una secuencia utilizando todos los argumentos
El siguiente ejemplo crea una secuencia llamada DecSeq utilizando el tipo de datos decimal, con un rango de 0 a 255. La secuencia comienza con 125 e incrementa en 25 cada vez que se genera un número. Debido a que la secuencia está configurada para circular cuando el valor excede el valor máximo de 200, la secuencia se reinicia con 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
de 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 de nuevo para ver cómo el valor de inicio vuelve a la opción MINVALUE
de 100.
Ejecute el siguiente código para confirmar el tamaño de la caché y ver el valor actual.
SELECT cache_size, current_value FROM sys.sequences WHERE name = 'DecSeq' ;
Véase También
ALTER SEQUENCE (Transact-SQL)
DROP SEQUENCE (Transact-SQL)
SIGUIENTE VALOR PARA (Transact-SQL)
Números de secuencia