miércoles, 25 de abril de 2012

SEQUENCES en SQL SERVER 2012



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.

También se puede crear con instrucciones T-SQL, algunos ejemplos de creación y aplicación se muestran a continuación:
Ejemplo1:
--Usar una base de datos
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


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

 
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


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;


--Finalmente una secuencia se puede destruir
DROP SEQUENCE SecuenciaOrdenada

1 comentario:

  1. Leyendo tu post, que dicho sea de paso, me parece excelente y de mucha utilidad, me surge la pregunta. ¿No puedo usar valores de un campo de tabla para MINVALUE y MAXVALUE?
    tipo:
    "MINVALUE (Select U_NODSD FROM [@CK_CONTROL])
    MAXVALUE (Select U_NOHST FROM [@CK_CONTROL])
    INCREMENT BY 1
    CYCLE"

    ResponderEliminar