SQL Server 2008: Mejoras para desarrolladores (I)!

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?

image image
  • 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.

Nuevos Virtual Labs sobre desarrollo en SharePoint!

Microsoft acaba de liberar dos nuevos Virtual Labs sobre desarrollo en SharePoint. En concreto, la temática de los mismos es la siguiente:

  • MSDN Virtual Lab: Event Handlers, en el que se detalla como crear manejadores de eventos asociados a listas de SharePoint de manera que asíncronamente o síncronamente podremos ejecutar nuestro código personalizado en respuesta al evento capturado. Podéis acceder a este virtual lab en este enlace.
  • MSDN Virtual Lab: Workflow, en el que veremos como construir workflows simples asociados a una biblioteca de documentos, e incluso como modificar el estado de un workflow en ejecución. Podéis acceder a este virtual lab en este otro enlace.

Y para completar este post tan corto…una imagen graciosa: SharePoint a la escocesa ;-).