En este post voy a explicar las principales novedades o funcionalidades que incorpora SQL Server 2008 desde un punto de vista de programación mediante el lenguaje Transact-SQL (T-SQL).
Os recomiendo instalar la base de datos de ejemplo AdventureWorks2008, que se encuentra aquí.
Declaración de variables e inicializaciones
Ya es posible declarar una variable y asignarle al mismo tiempo un valor:
En este caso declaramos una variable de tipo entero y se le asigna el valor 0.
Constructores de fila
Mediante los constructores de fila es posible insertar distintas filas en una tabla mediante una única sentencia. El ejemplo se basa en una tabla creada previamente, que se incluye en el script:
--CREACIÓN DE LA TABLA
CREATE TABLE dbo.Paises
(
IDPais VARCHAR(2) PRIMARY KEY,
Descripcion VARCHAR(500),
FechaModif DATETIME
)
--INSERT MEDIANTE CONSTRUCTORES DE FILA
INSERT INTO dbo.Paises
VALUES ('MA','Malta',SYSDATETIME()),
('IR','Ireland',SYSDATETIME()),
('FR','France',SYSDATETIME())
En este caso creamos una tabla que guarda información de paises, y en una sola instrucción insert agregamos 3 registros en la tabla.
Cabe indicar que el número máximo de filas a insertar en una instrucción es de 1.000, y que la instrucción se ejecuta como una única transacción (si alguno de los insert no es correcto, no se realiza ninguno de ellos).
Instrucción OUTPUT
Mediante la instrucción OUTPUT podemos acceder a los registros afectados por una operación de insert, update, delete o merge. Es importante notar que esta instrucción ya estaba disponible en SQL Server 2005.
--DECLARAMOS UNA VARIABLE DE TIPO TABLA
DECLARE @tblEliminados TABLE(Codigo VARCHAR(2),Nombre VARCHAR(500))
--ELIMINAMOS TODOSO LOS REGISTROS DE LA TABLA Y LOS GUARDAMOS EN LA VARIABLE
DELETE FROM dbo.Paises
OUTPUT deleted.IDPais, deleted.Descripcion INTO @tblEliminados
--MOSTRAMOS LOS REGISTROS ELIMINADOS
SELECT * FROM @tblEliminados
En este ejemplo podemos comprobar como solo guardamos los datos de las columnas IDPais y Descripción sobre la variable de tipo tabla creada previamente (en las columnas codigo y nombre).
Instrucción MERGE
Mediante esta instrucción es posible definir qué acción se debe llevar a cabo sobre los registros de una tabla cuando éstos se encuentran (match) o no sobre los registros de una tabla origen distinta.
En el siguiente ejemplo añadiremos paises a nuestra tabla a partir de una tabla origen (person.CountryRegion de la base de datos AdventureWorks), siempre y cuando no existan previamente. Si se produce este último caso, entonces unicamente actualizaremos su fecha de modificacion.
MERGE dbo.Paises AS target
USING
(
SELECT CountryRegionCode,
Name
FROM Person.CountryRegion
) AS source (codigo,nombre)
ON target.IDPais=source.codigo
WHEN MATCHED THEN UPDATE SET FechaModif=SYSDATETIME()
WHEN NOT MATCHED THEN INSERT VALUES (codigo,nombre,SYSDATETIME());
Es importante observar la sintaxis de la instrucciones update e insert, ya que en ninguna de ambas se especifica la tabla donde se realiza la operación (se supone que es la tabla de destino o target, que en nuestro caso es la tabla dbo.Paises).
Esta instrucción
merge también se puede usar conjuntamente con la instrucción
output, de forma que podamos capturar la información de los registros afectados por la operación.
MERGE dbo.Paises AS target
USING
(
SELECT CountryRegionCode,
Name
FROM Person.CountryRegion
) AS source (codigo,nombre)
ON target.IDPais=source.codigo
WHEN MATCHED THEN UPDATE SET FechaModif=SYSDATETIME()
WHEN NOT MATCHED THEN INSERT VALUES (codigo,nombre,SYSDATETIME())
OUTPUT $action, Inserted.IDPais, Inserted.Descripcion,
Inserted.FechaModif, Deleted.FechaModif;
En este caso, tenemos acceso a una columna especial llamada $action, que nos permite saber qué operación se ha realizado (insert, update o delete). En la tabla inserted accedermos a los registros añadidos o actualizados (valor nuevo) a la tabla destino, mientras que en la tabla Deleted accederemos a los registros eliminados o actualizados (valor antiguo).
En el próximo post presentaré otras novedades que creo que os pueden ser de mucha utilidad.
¡Enjoy T-SQL!