2016/07/05

OBJETO SECUENCIA

PROBLEMA: Muchos o todos conocemos lo que es una columna con la propiedad autoincrementable, sin embargo, a veces requerimos de un variable que se pueda utilizar por toda la base de datos y que tenga la misma propiedad de ser autoincrementable al igual que una columna IDENTITY, sabemos que objeto utilizar?

SOLUCION: A partir de la versión 2012, SQL SERVER introdujo los objetos llamados SECUENCIA, dichos objetos pueden ser creados como cualquier otro, llámese una vista, una tabla, una función entre otros y con la particularidad que puede ser utilizado en cualquier lado de nuestra base de datos, veamos como crear uno y como utilizarlo.

Primero veamos la sintaxis que nos ofrece la MSDN
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 } ]
    [ ; ]

No detallaré todas las opciones, solo lo que creo considerable. Para empezar, es necesario señalar que dicho objeto se crea utilizando tipos de datos numéricos (INT, SMALLINT, BIGINT, TINYINT, FLOAT, NUMERIC, entre otros ). Veamos algunos ejemplos ahora:
USE pruebas; 

CREATE SEQUENCE dbo.objSecuencia AS INT
 START WITH 50
 INCREMENT BY 3
 MINVALUE 50 MAXVALUE 60
 CYCLE; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO


USE pruebas; 

CREATE SEQUENCE dbo.objSecuencia AS INT
 START WITH 50
 INCREMENT BY 3
 MINVALUE 50 MAXVALUE 60
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO


Secuencia hacia atrás:
USE pruebas;

CREATE SEQUENCE dbo.objSecuencia AS INT
 START WITH 50
 INCREMENT BY -3
 MINVALUE 50 MAXVALUE 60
 CYCLE
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO


USE pruebas;

CREATE SEQUENCE dbo.objSecuencia AS INT
 START WITH 50
 INCREMENT BY -3
 MINVALUE 50 MAXVALUE 60
 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO

SELECT NEXT VALUE FOR dbo.objSecuencia; 
GO


Si al objeto le especificamos el tipo de dato, es necesario respetar los rangos que dicho tipo de dato puede almacenar, un ejemplo el siguiente:
CREATE SEQUENCE dbo.objSecuencia AS TINYINT
 START WITH 0
 INCREMENT BY 50
 MINVALUE 0 MAXVALUE  255
GO


USE pruebas;

CREATE SEQUENCE dbo.objSecuencia AS TINYINT
 START WITH 0
 INCREMENT BY 100
 MINVALUE 0 MAXVALUE  255
 CYCLE
GO

DECLARE @tab TABLE ( columna1 TINYINT, descripcion VARCHAR(100) ); 

INSERT INTO @tab
SELECT NEXT VALUE FOR dbo.objSecuencia , 'uno'; 

INSERT INTO @tab
SELECT NEXT VALUE FOR dbo.objSecuencia , 'dos'; 

INSERT INTO @tab
SELECT NEXT VALUE FOR dbo.objSecuencia , 'tres'; 

INSERT INTO @tab
SELECT NEXT VALUE FOR dbo.objSecuencia , 'cuatro';

INSERT INTO @tab
SELECT NEXT VALUE FOR dbo.objSecuencia , 'cinco';

INSERT INTO @tab
SELECT NEXT VALUE FOR dbo.objSecuencia , 'seis';

SELECT * FROM @tab; 

Un último ejemplo, como les comentaba podemos utilizarlos en muchas partes de nuestra base de datos, aquí lo utilizaremos en una consulta de la base de datos AdventureWorks2014 junto con la clausula OVER
SELECT 
NEXT VALUE FOR dbo.objSecuencia OVER ( ORDER BY BusinessEntityID ) AS col, 
*
FROM HumanResources.Employee


Espero que con estos ejemplos puedan implementar objetos secuencia con lo requieran.

SALUDOS!
COMPARTE ESTA INFORMACION SI TE PARECIO INTERESANTE

0 comentarios:

Publicar un comentario