Compartir a través de


SEQUENCES en SQL SERVER 2012 (es-ES)

 

Es frecuente al momento de crear tablas usar una columna con  incrementos automáticos, para garantizar que siempre tendrá un valor único, para lo cual se suele recurrir en SQL Server a la función IDENTITY en una columna, esta función tiene sustituto  dentro de lo nuevo de SQL Server 2012 con el objeto llamado "SEQUENCES".

"SEQUENCES", es un objeto que permite llevar un valor correlativo especificándose su valor inicial, valor de incremento, su valor mínimo, máximo y su comportamiento puede ser cíclico es decir al llegar al valor máximo puede volver a iniciar, este objeto al igual que la función IDENTITY puede asociarse a una columna de la tabla pero a diferencia este puede asociarse a mas de una tabla y el valor de la columna se recupera de la memoria en lugar de desde el disco,  también al ser un objeto se puede utilizar en secuencias de instrucciones T-SQL, no precisamente asociadas a tablas.

 Para crear un objeto "SEQUENCES" de forma grafica se puede usar el SQL Server Management Studio, expandiendo la base de datos y buscando dentro de "Programmability", el contenedor de "SEQUENCES", como se muestra en la imagen siguiente.

 

 

http://4.bp.blogspot.com/-bs47SDnmFRQ/T5iB_G-Xt5I/AAAAAAAAAFQ/RelK9TioZ4s/s320/image001.jpg

 

También se puede crear con instrucciones T-SQL, algunos ejemplos de creación y aplicación se muestran a continuación:

 Ejemplo1:

--Vamos a usar una base de datos de ejemplo, en este caso usaremos Northwind

 USE Northwind
 Go

--Creación del objeto secuencia

CREATE SEQUENCE Conteo  
AS tinyint
START WITH 1   
INCREMENT BY 1    
GO

 

--Creación de una tabla

 Create Table Empleado
( IdEmpleado tinyint primary key, NombreEmpleado varchar(150)
 )
 GO

 

--Usar la función NEXT VALUE FOR... para usar la secuencia

 INSERT INTO Empleado (Idempleado,NombreEmpleado)
 VALUES  (NEXT VALUE FOR Conteo, 'Victor Cardenas')
 INSERT INTO Empleado (Idempleado,NombreEmpleado)
 VALUES (NEXT VALUE FOR Conteo, 'Claudia Hernández')
 GO

 

--Consultar la tabla

 Select * from empleado

 

http://2.bp.blogspot.com/-Kk-gt2Fal2c/T5iCa6xszAI/AAAAAAAAAFo/wkcDxP7Pm2E/s320/image002.jpg

 

Ejemplo 2:

 --Usar una base de datos

 USE Northwind
 Go

 --Creación del objeto secuencia

CREATE SEQUENCE Conteo2   
AS tinyint   
START WITH 1   
INCREMENT BY 1    
GO

 --Creación de una tabla incluyendo la instrucción NEXT VALUE FOR... como valor default de una columna

 Create Table Empleado2 
 ( IdEmpleado tinyint primary key DEFAULT (NEXT VALUE FOR Conteo2)
 , NombreEmpleado varchar(150))
 GO

 

--insertar datos a la tabla

INSERT INTO Empleado2 (NombreEmpleado) VALUES ('Victor Cardenas')
INSERT INTO Empleado2 (NombreEmpleado) VALUES ('Claudia Hernández')
GO

 

--Consultar la tabla, y da el mismo resultado

 

Select * from empleado2

 

http://2.bp.blogspot.com/-Kk-gt2Fal2c/T5iCa6xszAI/AAAAAAAAAFo/wkcDxP7Pm2E/s320/image002.jpg

 

 

Ejemplo 3:

Al objeto secuencia es posible indicarle un valor máximo y acompañarlo de la instrucción CICLE para que al momento llegar al valor máximo vuelva a empezar, en el siguiente ejemplo no se asocia la secuencia a ninguna tabla, simplemente se usa una instrucción SELECT para disparar el valor de la secuencia 8 veces.

--Creación de una Nueva Secuencia con valor máximo y el argumento CICLE

CREATE SEQUENCE Conteo4 
AS tinyint
START WITH 0
INCREMENT BY 5
MAXVALUE 10
CYCLE

 GO

 --Ejecutar la instrucción select 8 veces

SELECT 
NEXT VALUE FOR Conteo4
GO 8

 

 

http://2.bp.blogspot.com/-FbIaOHSCj30/T5iC06VPHLI/AAAAAAAAAF4/ND1HgXEayUA/s1600/image004.jpg

 Ejemplo 4:

 --Nueva Secuencia

CREATE SEQUENCE SecuenciaOrdenada 
AS tinyint
START WITH 1
INCREMENT BY 1
MINVALUE 1
NO MAXVALUE
CYCLE;
GO

 

--Uso de la Secuencia con la instrucción OVER para numerar elementos de una tabla

SELECT Productid,Productname, Unitprice,
NEXT VALUE FOR SecuenciaOrdenada OVER (ORDER BY UnitPrice DESC) As Orden
FROM Products;

 --Como la secuencia seguira con su correltativo al volvera a ejecutar la --consulta Las Secuencias se pueden reiniciar

 

ALTER SEQUENCE SecuenciaOrdenada
RESTART WITH 1;

 

http://3.bp.blogspot.com/-gxvLwYKPL7M/T5iDGcJtU9I/AAAAAAAAAGA/vari7VqtohQ/s1600/image005.jpg

 

--Finalmente una secuencia se puede destruir

 

DROP SEQUENCE SecuenciaOrdenada