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