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!