¿Para qué sirven las User Defined Table Type?

Muchas veces necesitamos pasar gran cantida de datos a una base de datos y podemos usar dentro del MS-SQL definiciones similares a lo que es un datatabla, podemos crear un Tipo de Dato que sea una Tabla definida por el usuario (User-Defined Table Types), utilizando una sentencia CREATE TYPE, de tal modo que además de permitirnos declarar variables de Tipo Tabla

La sintaxis es muy sensilla:

CREATE TYPE dbo.TLineasPedido AS TABLE
( CodArt INT
, Cantidad INT,
, Nombre VARCHAR(200)
)
;

La creación de este tipo de dato está sujeta a varias limitaciones, comprados a una tabla con CREATE TABLE. Por ejemplo, no es posible crearlo de forma gráfica (es decir, utilizando el SQL Server Management Studio) aunque si es posible visualizarlos y eliminarlos de forma gráfica con SSMS, y además tampoco puede ser modificado (toda modificación pasa por eliminar el tipo – DROP TYPE – y volver a crearlo – CREATE TYPE – incluyendo las modificaciones deseadas).
El Tipo de Dato de Tipo Tabla, se puede usar con un Procedimiento Almacenado y utilizar el tipo recién creado como parámetro, en cuyo caso deberemos añadir la cláusula READONLY al parámetro de Tipo Tabla.
Por ejemplo de la creación de un Procedimiento Almacenado con un parámetro de Tipo Tabla, el cual se limita a insertar el contenido de la variable de Tipo Tabla en la tabla de Líneas de Pedido 

CREATE PROCEDURE AddLineasPedido
 (@CodPedido INT, @LineasPedido TLineasPedido READONLY)
 as

BEGIN 
INSERT INTO dbo.LineasPedido
SELECT @CodPedido, CodArticulo, Cantidad, DescriArticulo, PrecioArticulo
FROM @LineasPedido
END


Una vez que hemos creado el Tipo de Dato de Tipo Tabla, podríamos crear un Procedimiento Almacenado y utilizar el tipo recién creado como parámetro, en cuyo caso deberemos añadir la cláusula READONLY al parámetro de Tipo Tabla. A continuación se muestra un ejemplo de la creación de un Procedimiento Almacenado con un parámetro de Tipo Tabla, el cual se limita a insertar el contenido de la variable de Tipo Tabla en la tabla de Líneas de Pedido 

CREATE PROCEDURE addLineasPedido 
(@CodPedido INT, @LineasPedido TLineasPedido READONLY)
AS
BEGIN
INSERT INTO dbo.LineasPedido
SELECT @CodPedido, CodArticulo, Cantidad, DescriArticulo, PrecioArticulo
FROM @LineasPedido
END

Realizado esto, ya podremos utilizar nuestro Procedimiento Almacenado y pasarle una variable de Tipo Tabla. A continuación se muestra un ejemplo de uso, en el cual, se declara una variable de Tipo Tabla, en la que se insertan las correspondientes filas utilizando una única sentencia INSERT de múltiples filas, para finalmente ejecutar el Procedimiento Almacenado pasándole los parámetros que necesita


DECLARE @MiPedido TLineasPedido

INSERT INTO @MiPedido
VALUES
(10007, 6, 'Leche', 5.45)
,(10003, 7, 'Pan', 0.83)
,(10013, 24, 'Lentejas', 2.31)

EXEC dbo.addLineasPedido 1, @MiPedido


Referencias

https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/tasks/using-user-defined-tables?view=sql-server-2017
http://www.guillesql.es/Articulos/Tipo_Dato_Tabla_SQLServer.aspx
http://www.sqlservercentral.com/blogs/steve_jones/2012/09/19/creating-a-user-defined-table-type/

Comentarios

Entradas más populares de este blog

¿Cómo buscar tweets antiguos de una persona?

¿Qué es la Norma GAMP 5 y para que sirve?

¿Que tipos de Mensajes de HL7 hay?