Además de nuevas funcionalidades y herramientas que facilitan la labor de los DBA’s, SQL Server 2008 viene con una serie de mejoras para desarrolladores, desde el punto de vista de novedades en T-SQL. Entre ellas destacan:
- Los Table Valued Parametes (TPVs).
- Los constructores de fila, que ya nos introdujo Percy Reyes hace un tiempo.
- La cláusula Merge.
- Los Grouping Sets.
En este primer post vamos a ver en que consisten los TPV’s. Empecemos.
Table Valued Parameters
Los TPV’s son un nuevo tipo de parámetro de SQL Server 2008 que habilita el envío de múltiples filas de datos en una sentencia SQL o en un procedimiento almacenado (SP) sin necesidad de crear una tabla temporal o múltiples parámetros. Podemos ver los TPV’s como los arrays de parámetros en OLE DB y ODBC, pero ofreciendo mucha más flexibilidad e integración con T-SQL. Para ver los TPV’s en funcionamiento, seguiremos los siguientes pasos:
- Partimos de una BD de pruebas LABDB.
- Creamos una nueva tabla en LABDB mediante la siguiente consulta:
|
USE LABDB GO CREATE TABLE dbo.Empleado( ID_Empleado int NOT NULL, NombreEmpleado nvarchar(100) NOT NULL, EmailEmpleado nvarchar(100) NOT NULL) |
- Creamos un procedimiento almacenado (SP) que permita insertar valores en la tabla anterior:
|
USE LABDB GO CREATE PROCEDURE NuevoEmpleado(@ID_Empleado int, @NombreEmpleado nvarchar(100),@EmailEmpleado nvarchar(100)) As BEGIN INSERT INTO dbo.Empleado values( @ID_Empleado, @NombreEmpleado, @EmailEmpleado) END |
- Insertamos unos pocos registros utilizando este SP:
|
USE LABDB GO execute NuevoEmpleado 1,’John McLean’,'JohnMcLean@contoso.com’ execute NuevoEmpleado 2,’Bob Smith’,'BobSmith@contoso.com’ execute NuevoEmpleado 3,’Ted Connery’,'TedConnery@contoso.com’ |
Como vemos, una vez creada la tabla y el SP, insertar datos en la misma es sencillo. Sin embargo, la aproximación anterior presenta varios problemas:
- Múltiples idas y venidas a la BD.
- Se necesita ejecutar el SP varias veces.
- El código nos es eficiente
Una alternativa a estos problemas es el uso de tablas temporales. Veámoslo:
- Lo primero que vamos a hacer es eliminar los datos de la tabla Empleado:
|
USE LABDB Truncate table dbo.Empleado |
- A continuación vamos a crear un nuevo procedimiento almacenado que permite insertar datos en la tabla Empleado por medio de una tabla temporal de datos:
|
USE LABDB GO CREATE PROCEDURE NuevoEmpleadoTempTable As BEGIN INSERT INTO dbo.Empleado SELECT * FROM #EmpleadoTempTable END |
- Creamos la tabla temporal:
|
USE LABDB GO CREATE TABLE dbo.#EmpleadoTempTable( ID_Empleado int NOT NULL, NombreEmpleado nvarchar(100) NOT NULL, EmailEmpleado nvarchar(100) NOT NULL) |
- Insertamos valores en la tabla temporal:
|
USE LABDB GO insert into #EmpleadoTempTable values (1,’John McLean’,'JohnMcLean@contoso.com’) insert into #EmpleadoTempTable values (2,’Bob Smith’,'BobSmith@contoso.com’) insert into #EmpleadoTempTable values (3,’Ted Connery’,'TedConnery@contoso.com’) |
- Ejecutamos el procedimiento almacenado:
|
USE LABDB GO execute NuevoEmpleadoTempTable |
Lógicamente, esta aproximación funciona sin problemas. Sin embargo, es una alternativa más laboriosa aún. Además, tiene el problema de que la tabla temporal permanece en la BD y no se destruye una vez que se ha creado y usado. Veamos por fin la opción de los TPV’s:
- Lo primero que vamos a hacer es eliminar los datos de la tabla Empleado:
|
USE LABDB Truncate table dbo.Empleado |
- Creamos un nuevo TPV:
|
USE LABDB GO CREATE TYPE EmpleadoTableType AS TABLE (ID_Empleado INT, NombreEmpleado nvarchar(100), EmailEmpleado nvarchar(100)) |
- Creamos un nuevo procedimiento almacenado que utilice el TPV que acabamos de crear para insertar datos en la tabla Empleado:
|
USE LABDB GO if object_id(‘NuevoEmpleado’) is not null drop procedure NuevoEmpleado CREATE PROCEDURE NuevoEmpleado(@DetallesEmpleado EmpleadoTableType READONLY) As BEGIN INSERT INTO dbo.Employee SELECT * FROM @DetallesEmpleado END |
- Declaramos un nuevo TPV, e insertamos valores. A continuación ejecutamos el SP anterior:
|
USE LABDB GO DECLARE @NuevosEmpleados EmpleadoTableType INSERT INTO @NuevosEmpleados VALUES(1,’John McLean’,'JohnMcLean@contoso.com’) INSERT INTO @NuevosEmpleados VALUES(2,’Bob Smith’,'BobSmith@contoso.com’) INSERT INTO @NuevosEmpleados VALUES(3,’Ted Connery’,'TedConnery@contoso.com’)
EXECUTE NuevoEmpleado @NuevosEmpleados Go |
Sin más, comprobamos que los datos se han insertado correctamente en la BD ¿Qué ventajas nos dan los TPV’s?
- Proporcionan un modelo simple de programación.
- Se reduce el número de idas y venidas a la BD.
- Fuertemente tipado.
- …
Y hasta aquí el primero de los post sobre mejoras para desarrolladores en SQL Server 2008. Espero que el post os haya resultado interesante.
