Utilizzare parametri con valori di tabella (Motore di database)Use Table-Valued Parameters (Database Engine)

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2016)sìDatabase SQL di AzuresìAzure SQL Data Warehouse sìParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

I parametri con valori di tabella vengono dichiarati utilizzando tipi di tabella definiti dall'utente.Table-valued parameters are declared by using user-defined table types. I parametri con valori di tabella consentono di inviare più righe di dati a un'istruzione o a una routine Transact-SQLTransact-SQL , ad esempio una stored procedure o una funzione, senza creare una tabella temporanea o molti parametri.You can use table-valued parameters to send multiple rows of data to a Transact-SQLTransact-SQL statement or a routine, such as a stored procedure or function, without creating a temporary table or many parameters.

I parametri con valori di tabella sono analoghi alle matrici di parametri in OLE DB e ODBC, ma offrono più flessibilità e maggiore integrazione con Transact-SQLTransact-SQL.Table-valued parameters are like parameter arrays in OLE DB and ODBC, but offer more flexibility and closer integration with Transact-SQLTransact-SQL. Un ulteriore vantaggio consiste nel fatto che tali parametri possono essere utilizzati in operazioni basate su set.Table-valued parameters also have the benefit of being able to participate in set-based operations.

Transact-SQLTransact-SQL passa i parametri con valori di tabella alle routine per riferimento in modo da evitare l'esecuzione di una copia dei dati di input. passes table-valued parameters to routines by reference to avoid making a copy of the input data. È possibile creare ed eseguire routine Transact-SQLTransact-SQL con parametri con valori di tabella e chiamarle da codice Transact-SQLTransact-SQL o client gestiti o nativi in qualsiasi linguaggio gestito.You can create and execute Transact-SQLTransact-SQL routines with table-valued parameters, and call them from Transact-SQLTransact-SQL code, managed and native clients in any managed language.

Contenuto dell'argomentoIn This Topic:

VantaggiBenefits

RestrizioniRestrictions

Parametri con valori di tabella e operazioni BULK INSERTTable-Valued Parameters vs. BULK INSERT Operations

EsempioExample

Vantaggi Benefits

L'ambito di un parametro con valori di tabella è costituito dalla stored procedure, dalla funzione o dal testo Transact-SQLTransact-SQL dinamico, esattamente come per gli altri parametri.A table-valued parameter is scoped to the stored procedure, function, or dynamic Transact-SQLTransact-SQL text, exactly like other parameters. Analogamente, una variabile del tipo di tabella ha lo stesso ambito di qualsiasi altra variabile locale creata utilizzando un'istruzione DECLARE.Similarly, a variable of table type has scope like any other local variable that is created by using a DECLARE statement. È possibile dichiarare variabili con valori di tabella all'interno di istruzioni Transact-SQLTransact-SQL dinamiche e passarle come parametri con valori di tabella a stored procedure e funzioni.You can declare table-valued variables within dynamic Transact-SQLTransact-SQL statements and pass these variables as table-valued parameters to stored procedures and functions.

I parametri con valori di tabella offrono maggiore flessibilità e, in alcuni casi, prestazioni migliori rispetto alle tabelle temporanee o ad altre modalità disponibili per passare un elenco di parametri.Table-valued parameters offer more flexibility and in some cases better performance than temporary tables or other ways to pass a list of parameters. I parametri con valori di tabella offrono i vantaggi seguenti:Table-valued parameters offer the following benefits:

  • Non acquisiscono blocchi per il popolamento iniziale di dati da un client.Do not acquire locks for the initial population of data from a client.

  • Forniscono un modello di programmazione semplice.Provide a simple programming model.

  • Consentono di includere logica di business complessa in una singola routine.Enable you to include complex business logic in a single routine.

  • Riducono il numero di round trip al server.Reduce round trips to the server.

  • Possono avere una struttura di tabella con cardinalità diversa.Can have a table structure of different cardinality.

  • Sono fortemente tipizzati.Are strongly typed.

  • Consentono al client di specificare tipo di ordinamento e chiavi univoche.Enable the client to specify sort order and unique keys.

  • Vengono memorizzati nella cache come una tabella temporanea quando vengono utilizzati in una stored procedure.Are cached like a temp table when used in a stored procedure. A partire da SQL Server 2012SQL Server 2012, anche i parametri con valori di tabella sono memorizzati nella cache per le query con parametri.Starting with SQL Server 2012SQL Server 2012, table-valued parameters are also cached for parameterized queries.

Restrizioni Restrictions

Ai parametri con valori di tabella si applicano le restrizioni seguenti:Table-valued parameters have the following restrictions:

  • SQL ServerSQL Server non gestisce statistiche su colonne di parametri con valori di tabella. does not maintain statistics on columns of table-valued parameters.

  • I parametri con valori di tabella devono essere passati come parametri READONLY di input alle routine Transact-SQLTransact-SQL .Table-valued parameters must be passed as input READONLY parameters to Transact-SQLTransact-SQL routines. Non è possibile eseguire operazioni DML, ad esempio UPDATE, DELETE o INSERT, su un parametro con valori di tabella nel corpo di una routine.You cannot perform DML operations such as UPDATE, DELETE, or INSERT on a table-valued parameter in the body of a routine.

  • Non è possibile utilizzare un parametro con valori di tabella come destinazione di un'istruzione SELECT INTO o INSERT EXEC.You cannot use a table-valued parameter as target of a SELECT INTO or INSERT EXEC statement. Un parametro con valori di tabella può essere incluso nella clausola FROM di un'istruzione SELECT INTO o nella stringa o stored procedure INSERT EXEC.A table-valued parameter can be in the FROM clause of SELECT INTO or in the INSERT EXEC string or stored procedure.

Parametri con valori di tabella e operazioni BULK INSERT Table-Valued Parameters vs. BULK INSERT Operations

L'utilizzo di parametri con valori di tabella è confrontabile con altre modalità di utilizzo di variabili basate su set, ma può spesso risultare più rapido nel caso di set di dati di notevoli dimensioni.Using table-valued parameters is comparable to other ways of using set-based variables; however, using table-valued parameters frequently can be faster for large data sets. Rispetto alle operazioni bulk, che comportano costi di avvio maggiori, i parametri con valori di tabella garantiscono livelli di prestazioni ottimali per operazioni di inserimento di non oltre 1.000 righe.Compared to bulk operations that have a greater startup cost than table-valued parameters, table-valued parameters perform well for inserting less than 1000 rows.

I parametri con valori di tabella riutilizzati possono sfruttare il vantaggio derivante dalla memorizzazione nella cache della tabella temporanea,Table-valued parameters that are reused benefit from temporary table caching. che consente di ottenere una migliore scalabilità rispetto alle operazioni BULK INSERT equivalenti.This table caching enables better scalability than equivalent BULK INSERT operations. Se si eseguono operazioni di inserimento di righe di entità ridotta, è possibile ottenere vantaggi minimi in termini di prestazioni utilizzando elenchi di parametri o istruzioni batch anziché operazioni BULK INSERT o parametri con valori di tabella.By using small row-insert operations a small performance benefit might be gained by using parameter lists or batched statements instead of BULK INSERT operations or table-valued parameters. Tali metodi, tuttavia, risultano meno efficaci da programmare e le prestazioni si riducono rapidamente con l'aumentare del numero di righe.However, these methods are less convenient to program, and performance decreases quickly as rows increase.

I parametri con valori di tabella garantiscono livelli di prestazioni analoghi o migliori rispetto all'implementazione di una matrice di parametri equivalente.Table-valued parameters perform equally well or better than an equivalent parameter array implementation.

Esempio Example

Nell'esempio seguente viene utilizzato Transact-SQLTransact-SQL e viene illustrato come creare un tipo di parametro con valori di tabella, dichiarare una variabile per farvi riferimento, riempire un elenco di parametri e quindi passare i valori a una stored procedure.The following example uses Transact-SQLTransact-SQL and shows you how to create a table-valued parameter type, declare a variable to reference it, fill the parameter list, and then pass the values to a stored procedure.

USE AdventureWorks2012;  
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 dbo. usp_InsertProductionLocation  
    @TVP LocationTableType READONLY  
    AS   
    SET NOCOUNT ON  
    INSERT INTO AdventureWorks2012.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 AdventureWorks2012.Person.StateProvince;  

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

Vedere ancheSee Also

CREATE TYPE (Transact-SQL) CREATE TYPE (Transact-SQL)
DECLARE @local_variable (Transact-SQL) DECLARE @local_variable (Transact-SQL)
sys.types (Transact-SQL) sys.types (Transact-SQL)
sys.parameters (Transact-SQL) sys.parameters (Transact-SQL)
sys.parameter_type_usages (Transact-SQL) sys.parameter_type_usages (Transact-SQL)
CREATE PROCEDURE (Transact-SQL) CREATE PROCEDURE (Transact-SQL)
CREATE FUNCTION (Transact-SQL) CREATE FUNCTION (Transact-SQL)