CREATE SEQUENCE (Transact-SQL)CREATE SEQUENCE (Transact-SQL)

SE APLICA A: síSQL Server síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Crea un objeto de secuencia y especifica sus propiedades.Creates a sequence object and specifies its properties. 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.A sequence is a user-defined schema bound object that generates a sequence of numeric values according to the specification with which the sequence was created. 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.The sequence of numeric values is generated in an ascending or descending order at a defined interval and can be configured to restart (cycle) when exhausted. Las secuencias, a diferencia de las columnas de identidad, no se asocian a tablas concretas.Sequences, unlike identity columns, are not associated with specific tables. Las aplicaciones hacen referencia a un objeto de secuencia para recuperar su valor siguiente.Applications refer to a sequence object to retrieve its next value. La aplicación controla la relación entre las secuencias y tablas.The relationship between sequences and tables is controlled by the application. Las aplicaciones de usuario pueden hacer referencia un objeto de secuencia y coordinar los valores a través de varias filas y tablas.User applications can reference a sequence object and coordinate the values across multiple rows and tables.

A diferencia de los valores de columnas de identidad que se generan cuando se insertan filas, una aplicación puede obtener el número de secuencia siguiente sin insertar la fila llamando a la función NEXT VALUE FOR.Unlike identity columns values that are generated when rows are inserted, an application can obtain the next sequence number without inserting the row by calling the NEXT VALUE FOR function. Use sp_sequence_get_range para obtener varios números de secuencia a la vez.Use sp_sequence_get_range to get multiple sequence numbers at once.

Para obtener información sobre las funciones CREATE SEQUENCE y NEXT VALUE FOR y escenarios en los que se usan, vea Números de secuencia.For information and scenarios that use both CREATE SEQUENCE and the NEXT VALUE FOR function, see Sequence Numbers.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

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 } ]  
    [ ; ]  

ArgumentosArguments

sequence_namesequence_name
Especifica el nombre exclusivo por el que se conoce la secuencia en la base de datos.Specifies the unique name by which the sequence is known in the database. El tipo es sysname.Type is sysname.

[ built_in_integer_type | user-defined_integer_type[ built_in_integer_type | user-defined_integer_type
Una secuencia se puede definir como de cualquier tipo entero.A sequence can be defined as any integer type. Están permitidos los siguientes tiposThe following types are allowed.

  • tinyint: abarca de 0 a 255tinyint - Range 0 to 255
  • smallint: abarca de -32 768 a 32 767smallint - Range -32,768 to 32,767
  • int: abarca de -2 147 483 648 a 2 147 483 647int - Range -2,147,483,648 to 2,147,483,647
  • bigint: abarca de -9 223 372 036 854 775 808 a 9 223 372 036 854 775 807bigint - Range -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • decimal y numeric con una escala de 0.decimal and numeric with a scale of 0.
  • Cualquier tipo de datos definido por el usuario (tipo de alias) que esté basado en uno de los tipos permitidos.Any user-defined data type (alias type) that is based on one of the allowed types.

Si no se proporciona ningún tipo de datos, el tipo de datos bigint se usa como valor predeterminado.If no data type is provided, the bigint data type is used as the default.

START WITH <constant>START WITH <constant>
Primer valor devuelto por el objeto de secuencia.The first value returned by the sequence object. El valor START debe ser menor o igual que el máximo, y mayor o igual que el valor mínimo del objeto de secuencia.The START value must be a value less than or equal to the maximum and greater than or equal to the minimum value of the sequence object. 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.The default start value for a new sequence object is the minimum value for an ascending sequence object and the maximum value for a descending sequence object.

INCREMENT BY <constant>INCREMENT BY <constant>
Valor usado para incrementar (o disminuir si es negativo) el valor del objeto de secuencia para cada llamada a la función NEXT VALUE FOR.Value used to increment (or decrement if negative) the value of the sequence object for each call to the NEXT VALUE FOR function. Si el incremento es un valor negativo, el objeto de secuencia es descendente; de lo contrario, es ascendente.If the increment is a negative value, the sequence object is descending; otherwise, it is ascending. El incremento no puede ser 0.The increment cannot be 0. El incremento predeterminado para un nuevo objeto de secuencia es 1.The default increment for a new sequence object is 1.

[ MINVALUE <constant> | NO MINVALUE ][ MINVALUE <constant> | NO MINVALUE ]
Especifica los límites del objeto de secuencia.Specifies the bounds for the sequence object. El valor mínimo predeterminado para un nuevo objeto de secuencia es el valor mínimo del tipo de datos del objeto de secuencia.The default minimum value for a new sequence object is the minimum value of the data type of the sequence object. Es cero para el tipo de datos tinyint y un número negativo para todos los demás.This is zero for the tinyint data type and a negative number for all other data types.

[ MAXVALUE <constant> | NO MAXVALUE[ MAXVALUE <constant> | NO MAXVALUE
Especifica los límites del objeto de secuencia.Specifies the bounds for the sequence object. El valor máximo predeterminado para un nuevo objeto de secuencia es el valor máximo del tipo de datos del objeto de secuencia.The default maximum value for a new sequence object is the maximum value of the data type of the sequence object.

[ CYCLE | NO CYCLE ][ CYCLE | NO CYCLE ]
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.Property that specifies whether the sequence object should restart from the minimum value (or maximum for descending sequence objects) or throw an exception when its minimum or maximum value is exceeded. La opción de ciclo predeterminado para los nuevos objetos de secuencia es NO CYCLE.The default cycle option for new sequence objects is NO CYCLE.

Nota

El ciclo de SEQUENCE se reinicia a partir del valor mínimo o máximo, no a partir del valor inicial.Cycling a SEQUENCE restarts from the minimum or maximum value, not from the start value.

[ CACHE [<constant> ] | NO CACHE ][ CACHE [<constant> ] | NO 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.Increases performance for applications that use sequence objects by minimizing the number of disk IOs that are required to generate sequence numbers. El valor predeterminado es CACHÉ.Defaults to CACHE.

Por ejemplo, si se elige un tamaño de caché de 50, SQL ServerSQL Server no mantiene 50 valores individuales almacenados en memoria caché.For example, if a cache size of 50 is chosen, SQL ServerSQL Server does not keep 50 individual values cached. Solo almacena en memoria caché el valor actual y el número de valores que se quedan en la memoria caché.It only caches the current value and the number of values left in the cache. 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.This means that the amount of memory required to store the cache is always two instances of the data type of the sequence object.

Nota

Si la opción de memoria caché se habilita sin especificar un tamaño de caché, el Motor de base de datos seleccionará un tamaño.If the cache option is enabled without specifying a cache size, the Database Engine will select a size. Sin embargo, los usuarios no deben confiar en que la selección sea coherente.However, users should not rely upon the selection being consistent. MicrosoftMicrosoft puede cambiar el método de cálculo del tamaño de la memoria caché sin previo aviso.might change the method of calculating the cache size without notice.

Cuando se crean con la opción CACHE, un apagado inesperado (como un corte de suministro eléctrico) puede provocar la pérdida de los números de secuencia que permanecen en la memoria caché.When created with the CACHE option, an unexpected shutdown (such as a power failure) may result in the loss of sequence numbers remaining in the cache.

Notas generalesGeneral Remarks

Los números de secuencia se generan fuera del ámbito de la transacción actual.Sequence numbers are generated outside the scope of the current transaction. Se utilizan tanto si la transacción que usa el número de secuencia se confirma como si se revierte.They are consumed whether the transaction using the sequence number is committed or rolled back. La validación de duplicados solo se produce una vez que un registro está totalmente relleno.Duplicate validation only occurs once a record is fully populated. 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 identifica como un duplicado.This can result in some cases where the same number is used for more than one record during creation, but then gets identified as a duplicate. 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.If this occurs and other autonumber values have been applied to subsequent records, this can result in a gap between autonumber values and is expected behavior.

Administración de la memoria cachéCache management

Para mejorar el rendimiento, SQL ServerSQL Server asigna con antelación el número de números de secuencia especificados por el argumento CACHE.To improve performance, SQL ServerSQL Server pre-allocates the number of sequence numbers specified by the CACHE argument.

Por ejemplo, imagine que se crea una secuencia nueva con el valor inicial 1 y 15 como tamaño de caché.For an example, a new sequence is created with a starting value of 1 and a cache size of 15. Cuando se necesita el primer valor, están disponibles los valores 1 a 15 de la memoria.When the first value is needed, values 1 through 15 are made available from memory. El último valor almacenado en memoria caché (15) se escribe en las tablas del sistema del disco.The last cached value (15) is written to the system tables on the disk. Cuando se utilizan los 15 números, la solicitud siguiente (la del número 16) hará que la memoria caché sea asignada de nuevo.When all 15 numbers are used, the next request (for number 16) will cause the cache to be allocated again. El nuevo último valor almacenado en memoria caché (30) se escribirá en las tablas del sistema.The new last cached value (30) will be written to the system tables.

Si el Motor de base de datosDatabase Engine se detiene después de utilizar 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.If the Motor de base de datosDatabase Engine is stopped after you use 22 numbers, the next intended sequence number in memory (23) is written to the system tables, replacing the previously stored number.

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).After SQL Server restarts and a sequence number is needed, the starting number is read from the system tables (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.The cache amount of 15 numbers (23-38) is allocated to memory and the next non-cache number (39) is written to the system tables.

Si el Motor de base de datosDatabase Engine 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).If the Motor de base de datosDatabase Engine stops abnormally for an event such as a power failure, the sequence restarts with the number read from system tables (39). Se pierden los números de secuencia asignados a la memoria (que nunca fueran solicitados por un usuario o aplicación).Any sequence numbers allocated to memory (but never requested by a user or application) are lost. Esta característica puede dejar huecos, pero garantiza que nunca se emita el mismo valor dos veces para un solo objeto de secuencia, a menos que se defina como CYCLE o se reinicie manualmente.This functionality may leave gaps, but guarantees that the same value will never be issued two times for a single sequence object unless it is defined as CYCLE or is manually restarted.

La memoria caché se mantiene en memoria realizando el seguimiento del valor actual (el último valor emitido) y el número de valores que se dejan en la memoria caché.The cache is maintained in memory by tracking the current value (the last value issued) and the number of values left in the cache. Por consiguiente, la cantidad de memoria que la memoria caché usa siempre es dos veces la del tipo de datos del objeto de secuencia.Therefore, the amount of memory used by the cache is always two instances of the data type of the sequence object.

Al establecer el argumento de la memoria caché en CYCLE, el valor de la secuencia actual se escribe en las tablas del sistema cada vez que se usa una secuencia.Setting the cache argument to NO CACHE writes the current sequence value to the system tables every time that a sequence is used. Esto puede ralentizar el rendimiento al aumentar el acceso al disco, pero reduce la posibilidad de que se produzcan huecos imprevistos.This might slow performance by increasing disk access, but reduces the chance of unintended gaps. Es posible que se sigan produciendo huecos si los números se solicitan con las funciones NEXT VALUE FOR o sp_sequence_get_range, pero entonces los números no se usan o se usan en transacciones no confirmadas.Gaps can still occur if numbers are requested using the NEXT VALUE FOR or sp_sequence_get_range functions, but then the numbers are either not used or are used in uncommitted transactions.

Cuando un objeto de secuencia usa la opción CACHE, si reinicia el objeto de secuencia o altera las propiedades del tamaño de caché, INCREMENT, CYCLE, MINVALUE o MAXVALUE, ello hará que la memoria caché se escriba en las tablas del sistema antes de que el cambio se produzca.When a sequence object uses the CACHE option, if you restart the sequence object, or alter the INCREMENT, CYCLE, MINVALUE, MAXVALUE, or the cache size properties, it will cause the cache to be written to the system tables before the change occurs. A continuación, la memoria caché vuelve a cargarse comenzando con el valor actual (es decir, no se salta ningún número).Then the cache is reloaded starting with the current value (i.e. no numbers are skipped). El cambio realizado en el tamaño de la memoria caché surte efecto de forma inmediata.Changing the cache size takes effect immediately.

Opción CACHE cuando hay disponibles valores almacenados en memoria cachéCACHE option when cached values are available

El siguiente proceso se produce cada vez que se solicita un objeto de secuencia para generar el valor siguiente para la opción CACHE si hay disponibles valores sin usar en la memoria caché en memoria para el objeto de secuencia.The following process occurs every time that a sequence object is requested to generate the next value for the CACHE option if there are unused values available in the in-memory cache for the sequence object.

  1. Se calcula el valor siguiente para el objeto de secuencia.The next value for the sequence object is calculated.

  2. El nuevo valor actual para el objeto de secuencia se actualiza en la memoria.The new current value for the sequence object is updated in memory.

  3. El valor calculado se devuelve a la instrucción que realiza la llamada.The calculated value is returned to the calling statement.

Opción CACHE cuando se agota la memoria cachéCACHE option when the cache is exhausted

Cada vez que se solicita un objeto de secuencia para generar el valor siguiente para la opción CACHE, si se ha agotado la memoria caché, tiene lugar el siguiente proceso:The following process occurs every time a sequence object is requested to generate the next value for the CACHE option if the cache has been exhausted:

  1. Se calcula el valor siguiente para el objeto de secuencia.The next value for the sequence object is calculated.

  2. Se calcula el último valor para la nueva memoria caché.The last value for the new cache is calculated.

  3. 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.The system table row for the sequence object is locked, and the value calculated in step 2 (the last value) is written to the system table. Se activa un xevent agotado en caché para notificar al usuario el nuevo valor conservado.A cache-exhausted xevent is fired to notify the user of the new persisted value.

Opción NO CACHENO CACHE option

Cada vez que se solicita que un objeto de secuencia genere el valor siguiente para la opción NO CACHE, tiene lugar el siguiente proceso:The following process occurs every time that a sequence object is requested to generate the next value for the NO CACHE option:

  1. Se calcula el valor siguiente para el objeto de secuencia.The next value for the sequence object is calculated.

  2. El nuevo valor actual para el objeto de secuencia se escribe en la tabla del sistema.The new current value for the sequence object is written to the system table.

  3. El valor calculado se devuelve a la instrucción que realiza la llamada.The calculated value is returned to the calling statement.

MetadatosMetadata

Para obtener información sobre las secuencias, consulte sys.sequences.For information about sequences, query sys.sequences.

SeguridadSecurity

PermisosPermissions

Requiere el permiso CREATE SEQUENCE, ALTERo CONTROL en el SCHEMA.Requires CREATE SEQUENCE, ALTER, or CONTROL permission on the SCHEMA.

  • Los miembros de los roles fijos de base de datos db_owner y db_ddladmin pueden crear, alterar y quitar los objetos de secuencia.Members of the db_owner and db_ddladmin fixed database roles can create, alter, and drop sequence objects.

  • Los miembros de los roles fijos de base de datos db_owner y db_datawriter pueden actualizar los objetos de secuencia haciendo que generen los números.Members of the db_owner and db_datawriter fixed database roles can update sequence objects by causing them to generate numbers.

En este ejemplo se concede al usuario el permiso AdventureWorks\Larry para crear secuencias en el esquema Test.The following example grants the user AdventureWorks\Larry permission to create sequences in the Test schema.

GRANT CREATE SEQUENCE ON SCHEMA::Test TO [AdventureWorks\Larry]  

La propiedad de un objeto de secuencia se puede transferir usando la instrucción ALTER AUTHORIZATION.Ownership of a sequence object can be transferred by using the ALTER AUTHORIZATION statement.

Si una secuencia utiliza un tipo de datos definido por el usuario, el creador de la secuencia debe tener el permiso REFERENCES en el tipo.If a sequence uses a user-defined data type, the creator of the sequence must have REFERENCES permission on the type.

AuditarAudit

Para auditar CREATE SEQUENCE, supervise el SCHEMA_OBJECT_CHANGE_GROUP.To audit CREATE SEQUENCE, monitor the SCHEMA_OBJECT_CHANGE_GROUP.

EjemplosExamples

Para obtener ejemplos de cómo crear secuencias y cómo usar la función NEXT VALUE FOR para generar los números de secuencia, vea Números de secuencia.For examples of creating sequences and using the NEXT VALUE FOR function to generate sequence numbers, see Sequence Numbers.

En la mayoría de estos ejemplos se crean objetos de secuencia en un esquema denominado Test.Most of the following examples create sequence objects in a schema named Test.

Para crear el esquema Test, ejecute la siguiente instrucción.To create the Test schema, execute the following statement.

CREATE SCHEMA Test ;  
GO  

A.A. Crear una secuencia que se incremente en 1Creating a sequence that increases by 1

En este ejemplo, Thierry crea una secuencia denominada CountBy1 que se incrementa en uno cada vez que se usa.In the following example, Thierry creates a sequence named CountBy1 that increases by one every time that it is used.

CREATE SEQUENCE Test.CountBy1  
    START WITH 1  
    INCREMENT BY 1 ;  
GO  

B.B. Crear una secuencia que se disminuya en 1Creating a sequence that decreases by 1

El ejemplo siguiente comienza en 0 y resta uno cada vez que se utiliza.The following example starts at 0 and counts into negative numbers by one every time it is used.

CREATE SEQUENCE Test.CountByNeg1  
    START WITH 0  
    INCREMENT BY -1 ;  
GO  

C.C. Crear una secuencia que se incremente en 5Creating a sequence that increases by 5

El siguiente ejemplo crea una secuencia que se incrementa en 5 cada vez que se utiliza.The following example creates a sequence that increases by 5 every time it is used.

CREATE SEQUENCE Test.CountBy1  
    START WITH 5  
    INCREMENT BY 5 ;  
GO  

D.D. Crear una secuencia que se inicia con un número designadoCreating a sequence that starts with a designated number

Después de importar una tabla, Thierry observa que el mayor número de identificación utilizado es 24.328.After importing a table, Thierry notices that the highest ID number used is 24,328. Thierry necesita una secuencia que generará números a partir de 24.329.Thierry needs a sequence that will generate numbers starting at 24,329. El siguiente código crea una secuencia que comienza en 24.329 y se incrementa en 1.The following code creates a sequence that starts with 24,329 and increments by 1.

CREATE SEQUENCE Test.ID_Seq  
    START WITH 24329  
    INCREMENT BY 1 ;  
GO  

E.E. Crear una secuencia utilizando los valores predeterminadosCreating a sequence using default values

En el siguiente ejemplo se crea una secuencia mediante los valores predeterminados.The following example creates a sequence using the default values.

CREATE SEQUENCE Test.TestSequence ;  

Ejecute la siguiente instrucción para ver las propiedades de la secuencia.Execute the following statement to view the properties of the sequence.

SELECT * FROM sys.sequences WHERE name = 'TestSequence' ;  

Una lista parcial del resultado demuestra los valores predeterminados.A partial list of the output demonstrates the default values.

start_value -9223372036854775808
increment 1
mimimum_value -9223372036854775808
maximum_value 9223372036854775807
is_cycling 0
is_cached 1
current_value -9223372036854775808

F.F. Crear una secuencia con un tipo de datos concretoCreating a sequence with a specific data type

En este ejemplo se crea una secuencia usando el tipo de datos smallint, que abarca de -32 768 a 32 767.The following example creates a sequence using the smallint data type, with a range from -32,768 to 32,767.

CREATE SEQUENCE SmallSeq 
    AS smallint ;  

G.G. Crear una secuencia utilizando todos los argumentosCreating a sequence using all arguments

En este ejemplo se crea una secuencia denominada DecSeq mediante el tipo de datos decimal, que abarca de 0 a 255.The following example creates a sequence named DecSeq using the decimal data type, having a range from 0 to 255. La secuencia se inicia con 125 y se incrementa en 25 cada vez que se genera un número.The sequence starts with 125 and increments by 25 every time that a number is generated. 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.Because the sequence is configured to cycle when the value exceeds the maximum value of 200, the sequence restarts at the minimum value of 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.Execute the following statement to see the first value; the START WITH option of 125.

SELECT NEXT VALUE FOR Test.DecSeq;  

Ejecute la instrucción tres veces más para devolver 150, 175 y 200.Execute the statement three more times to return 150, 175, and 200.

Ejecute la instrucción para ver de nuevo cómo vuelve el valor inicial a la opción MINVALUE 100.Execute the statement again to see how the start value cycles back to the MINVALUE option of 100.

Ejecute el siguiente código para confirmar el tamaño de caché y ver el valor actual.Execute the following code to confirm the cache size and see the current value.

SELECT cache_size, current_value   
FROM sys.sequences  
WHERE name = 'DecSeq' ;  

Consulte tambiénSee Also

ALTER SEQUENCE (Transact-SQL) ALTER SEQUENCE (Transact-SQL)
DROP SEQUENCE (Transact-SQL) DROP SEQUENCE (Transact-SQL)
NEXT VALUE FOR (Transact-SQL) NEXT VALUE FOR (Transact-SQL)
Números de secuenciaSequence Numbers