Blog del CIIN

Blog del Centro de Innovación en Integración de Cantabria
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.

Published 5/8/2008 23:12 por Juan Carlos González Martín

Archivado en:

Comentarios

# re: SQL Server 2008: Mejoras para desarrolladores (I)!@ Wednesday, August 06, 2008 4:44 AM

Hola, buen post, pero algo que se puede hacer para evitar idas  y vueltas es empleando un parametro de tipo XML donde almacenas los valores y el SP los procesa internamente haciendo el insert en la tabla, por cada Item del XML.

Saludos,

Alonso Morales

# re: SQL Server 2008: Mejoras para desarrolladores (I)!@ Wednesday, August 06, 2008 8:20 AM

Hola Alonso!

Gracias por el apunte!

Un saludo

JC's

Juan Carlos González Martín

# re: SQL Server 2008: Mejoras para desarrolladores (I)!@ Wednesday, August 06, 2008 10:07 AM

:-)

Muy buen post JC!

Alonso,

Es cierto lo que comentas, y hace un tiempo escribí un post al respecto:

geeks.ms/.../t-sql-leer-par-225-metros-xml-y-convertirlos-en-tablas.aspx

Sin embargo hay algo que no se le puede negar a un TVP. Es fuertemente tipado, cosa que el XML no.

A mi juicio es una novedad que cualquier desarrollador agradecerá enormemente, y lo raro es que no estuviese implementado antes.

Saludos,

Lluis Franco

# re: SQL Server 2008: Mejoras para desarrolladores (I)!@ Wednesday, August 06, 2008 10:58 AM

Hola Lluis!

Gracias por el comentario...la verdad es que los TPV's son una pasada y creo que van a ser muy de agradecer.

JC's

Juan Carlos González Martín

# re: SQL Server 2008: Mejoras para desarrolladores (I)!@ Wednesday, August 06, 2008 4:32 PM

JC's, gracias por compartir lo nuevo que encuentres :D, por cierto una artículo de Carlos Walzer similar al tema: msmvps.com/.../nuevas-caracter-237-sticas-para-desarrolladores-en-sql-server-2008.aspx.

Y nada, se espera las otras entregas :D..

Saludos,

Sergio Tarrillo

# re: SQL Server 2008: Mejoras para desarrolladores (I)!@ Wednesday, August 06, 2008 7:33 PM

Sergio, gracias a vosotros por vuestros comentarios...animan a escribir más.  Me apunto el blog de Carlos....otra RSS más...ya veréis el día que os comparta mis RSS.

Un saludo

JC's

Juan Carlos González Martín

# SQL Server 2008: Mejoras para desarrolladores (II)! « Pasi??n por la tecnolog??a…@ Thursday, August 07, 2008 10:27 PM

PingBack desde  SQL Server 2008: Mejoras para desarrolladores (II)! « Pasi??n por la tecnolog??a…

SQL Server 2008: Mejoras para desarrolladores (II)! « Pasi??n por la tecnolog??a…

# re: SQL Server 2008: Mejoras para desarrolladores (I)!@ Tuesday, August 12, 2008 10:22 AM

Por fin!

Ya era hora!

Es una funcionalidad que desde hace tiempo necesitaba SQL Server.

Por ciero ... ¿para cuando podremos agrupar procedimientos almacenados en packages como hacen otros productos (ORACL...)?

Devjoker

# SQL Server 2008: Mejoras para desarrolladores (III)! « Pasi??n por la tecnolog??a…@ Wednesday, August 13, 2008 12:31 PM

PingBack desde  SQL Server 2008: Mejoras para desarrolladores (III)! « Pasi??n por la tecnolog??a…

SQL Server 2008: Mejoras para desarrolladores (III)! « Pasi??n por la tecnolog??a…

# re: SQL Server 2008: Mejoras para desarrolladores (I)!@ Tuesday, August 19, 2008 10:07 AM

Buenas Devjoker,

Pues desconozco si Microsoft tiene pensado proporcionar la funcionalidad que comentas...pero ten seguro que si es una funcionalidad muy demandada, lo harán.

Un saludo

JC's

Juan Carlos González Martín

Deja tu comentario

(requerido) 
(requerido) 
(opcional)
(requerido)