Parámetros de valores de tabla (motor de base de datos)

Los parámetros con valores de tabla son un nuevo tipo de parámetro en SQL Server 2008. Los parámetros con valores de tabla se declaran utilizando tipos de tabla definidos por el usuario. Puede utilizar parámetros con valores de tabla para enviar varias filas de datos a una rutina o una instrucción Transact-SQL, como un procedimiento almacenado o una función, sin crear una tabla temporal o muchos parámetros.

Los parámetros con valores de tabla son como las matrices de parámetros en OLE DB y ODBC, pero proporcionan más flexibilidad y una integración más estrecha con Transact-SQL. Los parámetros con valores de tabla también tienen la ventaja de poder participar en operaciones basadas en conjuntos.

Nota

Transact-SQL pasa parámetros con valores de tabla a rutinas por referencia para evitar la realización de una copia de los datos de entrada.

Puede crear y ejecutar rutinas Transact-SQL con parámetros con valores de tabla y llamarlas desde código de Transact-SQL, clientes nativos y administrados en cualquier lenguaje administrado.

Crear y usar parámetros con valores de tabla en Transact-SQL

Los parámetros con valores de tabla tienen dos componentes principales: un tipo de SQL Server y un parámetro que hace referencia a ese tipo. Para crear y usar parámetros con valores de tabla, siga estos pasos:

  1. Cree un tipo de tabla y defina la estructura de la tabla.

    Para obtener más información sobre cómo crear un tipo de SQL Server, vea Tipos definidos por el usuario. Para obtener información sobre la forma de definir una estructura de tabla, vea CREATE TABLE (Transact-SQL).

  2. Declare una rutina que tenga un parámetro del tipo de tabla. Para obtener más información sobre rutinas de SQL Server, vea CREATE PROCEDURE (Transact-SQL) y CREATE FUNCTION (Transact-SQL).

  3. Declare una variable del tipo de tabla y haga referencia al tipo de tabla. Para obtener información sobre cómo declarar variables, vea DECLARE @local_variable (Transact-SQL).

  4. Rellene la variable de tabla utilizando una instrucción INSERT. Para obtener más información sobre cómo se insertan datos, vea Agregar filas mediante INSERT y SELECT.

  5. Una vez creada y rellena la variable de tabla, puede pasar la variable a una rutina.

    Cuando la rutina esté fuera del ámbito, el parámetro con valores de tabla dejará de estar disponible. La definición de tipo permanecerá hasta que se quite.

Para usar un parámetro con valores de tabla en SQL Server Native Client, vea Parámetros con valores de tabla (SQL Server Native Client).

Para usar un parámetro con valores tabla en ADO.NET, vea la documentación de ADO.NET.

Ventajas

Los parámetros con valores de tabla proporcionan más flexibilidad y, en algunos casos, un rendimiento mayor que las tablas temporales u otros medios para pasar una lista de parámetros. Los parámetros con valores de tabla proporcionan las ventajas siguientes:

  • No adquieren bloqueos para el rellenado inicial de datos de un cliente.

  • Proporcionan un modelo de programación simple.

  • Permiten la inclusión de lógica comercial compleja en una rutina única.

  • Reducen los viajes de ida y vuelta al servidor.

  • Pueden tener una estructura de tabla de cardinalidad diferente.

  • Tienen establecimiento inflexible de tipos.

  • Permiten al cliente especificar un criterio de ordenación y claves únicas.

Restricciones

Los parámetros con valores de tabla tienen las restricciones siguientes:

  • SQL Server no mantiene estadísticas en las columnas de parámetros con valores de tabla.

  • Los parámetros con valores de tabla se deben pasar como parámetros READONLY de entrada a rutinas Transact-SQL. No se pueden realizar operaciones de DML como UPDATE, DELETE o INSERT en un parámetro con valores de tabla en el cuerpo de una rutina.

  • No se puede utilizar un parámetro con valores de tabla como destino de una instrucción SELECT INTO o INSERT EXEC. Un parámetro con valores de tabla puede estar en la cláusula FROM de SELECT INTO o en el procedimiento almacenado o cadena INSERT EXEC.

Ámbito

Un parámetro con valores de tabla está incluido en el ámbito de procedimiento almacenado, función o texto Transact-SQL dinámico, exactamente igual que los demás parámetros. Del mismo modo, una variable de tipo de tabla tiene el mismo ámbito que cualquier otra variable local creada mediante una instrucción DECLARE. Puede declarar variables con valores de tabla en instrucciones Transact-SQL dinámicas y pasar estas variables como parámetros con valores de tabla a procedimientos almacenados y funciones.

Seguridad

Los permisos de los parámetros con valores de tabla siguen el modelo de seguridad de objeto para SQL Server mediante el uso de las palabras clave Transact-SQL siguientes: CREATE, GRANT, DENY, ALTER, CONTROL, TAKE OWNERSHIP, REFERENCES, EXECUTE, VIEW DEFINITION y REVOKE.

Para obtener información asociada a parámetros con valores de tabla, puede consultar las vistas de catálogo siguientes: sys.parameters (Transact-SQL), sys.types (Transact-SQL)y sys.table_types (Transact-SQL).

Parámetros con valores de tabla y operaciones BULK INSERT

El uso de parámetros con valores de tabla es comparable a otras formas de uso de variables basadas en conjuntos; sin embargo, el uso de parámetros con valores de tabla puede ser con frecuencia más rápido para grandes conjuntos de datos. Si se comparan con operaciones masivas que tienen un costo de inicio mayor que los parámetros con valores de tabla, el comportamiento de los parámetros con valores de tabla es excelente cuando se insertan menos de 1.000 filas.

Los parámetros con valores de tabla que se vuelven a utilizar se benefician del almacenamiento en caché de tablas temporales. Este almacenamiento en memoria caché de tablas proporciona una escalabilidad mejor que en el caso de operaciones BULK INSERT equivalentes. Si se usan pequeñas operaciones de inserción de filas, se puede conseguir una ligera mejora del rendimiento utilizando listas de parámetros o instrucciones por lotes en lugar de operaciones BULK INSERT o parámetros con valores de tabla. Sin embargo, estos métodos son menos apropiados para programar, y el rendimiento disminuye rápidamente cuando aumentan las filas.

Los parámetros con valores de tabla se comportan tan bien o mejor que una implementación de matriz de parámetros equivalente.

La tabla siguiente muestra qué tecnología se debe utilizar basándose en la velocidad de las operaciones de inserción.

Origen de datos

Lógica de servidor

Número de filas

Tecnología mejor

Archivo de datos con formato en el servidor

Inserción directa

< 1000

BULK INSERT

Archivo de datos con formato en el servidor

Inserción directa

> 1000

BULK INSERT

Archivo de datos con formato en el servidor

Compleja

< 1000

Parámetros con valores de tabla

Archivo de datos con formato en el servidor

Compleja

> 1000

BULK INSERT

Proceso de cliente remoto

Inserción directa

< 1000

Parámetros con valores de tabla

Proceso de cliente remoto

Inserción directa

> 1000

BULK INSERT

Proceso de cliente remoto

Compleja

< 1000

Parámetros con valores de tabla

Proceso de cliente remoto

Compleja

> 1000

Parámetros con valores de tabla

Ejemplos

En el ejemplo siguiente se utiliza Transact-SQL y se muestra la forma de crear un tipo de parámetro con valores de tabla, declarar una variable para hacer referencia a ella, rellenar la lista de parámetros y, a continuación, pasar los valores a un procedimiento almacenado.

USE AdventureWorks2008R2;
GO

/* Create a table type. */
CREATE TYPE LocationTableType AS TABLE 
( LocationName VARCHAR(50)
, CostRate INT );
GO

/* Create a procedure to receive data for the table-valued parameter. */
CREATE PROCEDURE usp_InsertProductionLocation
    @TVP LocationTableType READONLY
    AS 
    SET NOCOUNT ON
    INSERT INTO [AdventureWorks2008R2].[Production].[Location]
           ([Name]
           ,[CostRate]
           ,[Availability]
           ,[ModifiedDate])
        SELECT *, 0, GETDATE()
        FROM  @TVP;
        GO

/* Declare a variable that references the type. */
DECLARE @LocationTVP 
AS LocationTableType;

/* Add data to the table variable. */
INSERT INTO @LocationTVP (LocationName, CostRate)
    SELECT [Name], 0.00
    FROM 
    [AdventureWorks2008R2].[Person].[StateProvince];

/* Pass the table variable data to a stored procedure. */
EXEC usp_InsertProductionLocation @LocationTVP;
GO