sql >> Base de Datos >  >> RDS >> Database

Pasar la tabla de datos como parámetro a los procedimientos almacenados

Las aplicaciones de bases de datos del mundo real necesitan realizar múltiples solicitudes desde el front-end a la base de datos para llevar a cabo todo tipo de funciones.

Si una aplicación utiliza muchos datos, como las que se utilizan en bancos o aeropuertos, etc., la cantidad de viajes de datos puede ser enorme. Cada solicitud a una base de datos utiliza ancho de banda y requiere tiempo para ejecutarse. Sin los parámetros con valores de tabla, una aplicación frontal necesita realizar múltiples viajes de datos para manipular múltiples filas de datos. Sin embargo, con los parámetros con valores de tabla, se pueden insertar, actualizar y eliminar varias filas de una base de datos utilizando un solo comando parametrizado que toma un parámetro con valores de tabla.

Un parámetro con valores de tabla es un parámetro con un tipo de tabla. Con este parámetro, puede enviar varias filas de datos a un procedimiento almacenado o un comando SQL parametrizado en forma de tabla. Se puede usar Transact-SQL para acceder a los valores de columna de los parámetros con valores de tabla.

En este artículo, estudiaremos cómo podemos pasar una tabla de datos a un procedimiento almacenado. Sin embargo, antes de eso, veamos cómo solían pasar los datos tabulares antes que los parámetros con valores de tabla.

Pasar datos en formato tabular antes de los parámetros con valores de tabla

Los parámetros con valores de tabla se introdujeron en SQL Server 2008. Antes de eso, había opciones limitadas para pasar datos tabulares a procedimientos almacenados. La mayoría de los desarrolladores utilizaron uno de los siguientes métodos:

  1. Los datos de varias columnas y filas se representaban en forma de una serie de parámetros. Sin embargo, el número máximo de parámetros que se pueden pasar a un procedimiento almacenado de SQL Server es 2100. Por lo tanto, en el caso de una tabla grande, este método no podría usarse. Además, se requiere preprocesamiento en el lado del servidor para formatear los parámetros individuales en una forma tabular.
  2. Cree varias instrucciones SQL que puedan afectar a varias filas, como UPDATE. Los extractos se pueden enviar al servidor de forma individual o en lotes. Incluso si se envían en forma de lotes, las declaraciones se ejecutan individualmente en el servidor.
  3. Otra forma es usar cadenas delimitadas o documentos XML para agrupar datos de varias filas y columnas y luego pasar estos valores de texto a instrucciones SQL parametrizadas o procedimientos almacenados. El inconveniente de este enfoque era que necesitaba validar la estructura de datos para desagregar los valores.

Pasar la tabla de datos como parámetro a los procedimientos almacenados

Ahora veamos cómo se pueden usar los parámetros con valores de tabla para enviar datos a un procedimiento almacenado sin enfrentar ninguno de los problemas discutidos en la sección anterior. Los parámetros con valores de tabla permiten que se pasen varias filas de datos a un procedimiento almacenado mediante algún código Transact-SQL o desde la aplicación front-end. El tamaño máximo que puede tener un parámetro con valores de tabla es igual al tamaño máximo de memoria del servidor de la base de datos.

En esta sección, utilizaremos parámetros con valores de tabla junto con un procedimiento almacenado para insertar varias filas en una tabla de datos.

Pasar parámetros con valores de tabla a un procedimiento almacenado es un proceso de tres pasos:

  1. Cree un tipo de tabla definida por el usuario que corresponda a la tabla que desea completar.
  2. Pase la tabla definida por el usuario al procedimiento almacenado como un parámetro
  3. Dentro del procedimiento almacenado, seleccione los datos del parámetro pasado e insértelos en la tabla que desea completar.

Echemos un vistazo a un ejemplo de cómo podemos pasar una tabla de datos a un procedimiento almacenado utilizando la función de valores de tabla.

Primero, crea una tabla que queremos llenar. Ejecute el siguiente script:

CREATE DATABASE ShowRoom


USE ShowRoom
Create Table Cars
(
    Id int primary key,
    Name nvarchar(50),
    company nvarchar(50)
)
Go

En el script anterior, creamos una base de datos llamada ShowRoom con una tabla, es decir, Cars. La tabla Cars tiene tres columnas:Id, Name y company. Usaremos un procedimiento almacenado para llenar la tabla Cars.

Como se describió anteriormente, el primer paso es crear un tipo de tabla definida por el usuario que corresponda a la tabla que desea completar. Ejecute el siguiente script para hacerlo:

CREATE TYPE CarTableType AS TABLE
(
     Id int primary key,
    Name nvarchar(50),
    company nvarchar(50)
)
Go

En el script anterior, creamos la variable definida por el usuario CarTableType del tipo Table. Esta es la variable que pasaremos al procedimiento almacenado. Se puede ver que las columnas de la variable CarTableType son similares a las de la tabla Cars.

Ahora vamos a crear un procedimiento almacenado que acepte la variable CarTableType como parámetro. Dentro del procedimiento almacenado, SELECCIONAREMOS todos los registros de esta variable y los insertaremos en la tabla Cars. Ejecute el siguiente script para crear dicho procedimiento almacenado:

CREATE PROCEDURE spInsertCars
@CarType CarTableType READONLY
AS
BEGIN
    INSERT INTO Cars
    SELECT * FROM @CarType
END

En el script anterior, creamos el procedimiento almacenado spInsertCars. Es importante mencionar que debe especificar el parámetro definido por el usuario como READONLY dentro del procedimiento almacenado; si no lo hace, se producirá un error de tiempo de ejecución.

Puede ver que el procedimiento almacenado spInsertCars acepta el parámetro CarTableType y lo asigna a la variable @CarType del tipo CarTableType.

El paso final es crear una variable de la variable CarTableType, llenarla con datos ficticios y pasarla al procedimiento almacenado spInsertCars. Echa un vistazo a la siguiente secuencia de comandos:

DECLARE @CarTableType CarTableType

INSERT INTO @CarTableType VALUES (1, 'Corrolla', 'Toyota')
INSERT INTO @CarTableType VALUES (2, 'Civic', 'Honda')
INSERT INTO @CarTableType VALUES (3, '6', 'Audi')
INSERT INTO @CarTableType VALUES (4, 'c100', 'Mercedez')
INSERT INTO @CarTableType VALUES (5, 'Mustang', 'Ford')

EXECUTE spInsertCars @CarTableType

En el script anterior, primero declaramos la variable @CarTableType de tipo CarTableType. Luego insertamos 5 registros ficticios en esta variable. Finalmente, ejecutamos el procedimiento almacenado spInsertCars y le pasamos la variable @CarTableType como parámetro.

Dentro del procedimiento almacenado, se seleccionan cinco registros de la variable @CarTableType y se insertan en la tabla Cars. Ahora, si selecciona todos los registros de la tabla Cars, debería ver los registros recién insertados. Ejecute el siguiente script para hacerlo:

SELECT * FROM Cars

El resultado del script anterior se ve así:

Se puede ver en la salida que todos los registros de la variable @CarTableType se han insertado en la tabla Cars.