Costruttore di valori di tabella (Transact-SQL)Table Value Constructor (Transact-SQL)

Si applica a:Applies to: sìSQL ServerSQL Server (tutte le versioni supportate) yesSQL ServerSQL Server (all supported versions) Sìdatabase SQL di AzureAzure SQL DatabaseYesdatabase SQL di AzureAzure SQL DatabaseSi applica a:Applies to: sìSQL ServerSQL Server (tutte le versioni supportate) yesSQL ServerSQL Server (all supported versions) Sìdatabase SQL di AzureAzure SQL DatabaseYesdatabase SQL di AzureAzure SQL Database

Specifica un set di espressioni valore di riga da costruire in una tabella.Specifies a set of row value expressions to be constructed into a table. Il costruttore di valori di tabella Transact-SQLTransact-SQL consente di specificare più righe di dati in una sola istruzione DML.The Transact-SQLTransact-SQL table value constructor allows multiple rows of data to be specified in a single DML statement. È possibile specificare il costruttore di valori di tabella come clausola VALUES di un'istruzione INSERT ... VALUES oppure come tabella derivata nella clausola USING dell'istruzione MERGE o nella clausola FROM.The table value constructor can be specified either as the VALUES clause of an INSERT ... VALUES statement, or as a derived table in either the USING clause of the MERGE statement or the FROM clause.

Icona di collegamento a un argomento Convenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

VALUES ( <row value expression list> ) [ ,...n ]   
  
<row value expression list> ::=  
    {<row value expression> } [ ,...n ]  
  
<row value expression> ::=  
    { DEFAULT | NULL | expression }  

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 e versioni precedenti, vedere Documentazione delle versioni precedenti.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

ArgomentiArguments

VALUESVALUES
Introduce gli elenchi di espressioni valore di riga.Introduces the row value expression lists. Ogni elenco deve essere racchiuso tra parentesi e separato da una virgola.Each list must be enclosed in parentheses and separated by a comma.

Il numero di valori specificato in ciascun elenco deve essere uguale e i valori devono essere nello stesso ordine delle colonne nella tabella.The number of values specified in each list must be the same and the values must be in the same order as the columns in the table. Deve essere specificato un valore per ogni colonna della tabella oppure nell'elenco delle colonne devono essere specificate in modo esplicito le colonne per ciascun valore inserito.A value for each column in the table must be specified or the column list must explicitly specify the columns for each incoming value.

DEFAULTDEFAULT
Forza l'inserimento nel Motore di databaseDatabase Engine del valore predefinito di una colonna.Forces the Motore di databaseDatabase Engine to insert the default value defined for a column. Se per la colonna non è disponibile alcun valore predefinito e la colonna ammette valori NULL, viene inserito un valore NULL.If a default does not exist for the column and the column allows null values, NULL is inserted. DEFAULT non è un valore valido per una colonna Identity.DEFAULT is not valid for an identity column. Se specificato in un costruttore di valori di tabella, DEFAULT è consentito solo in un'istruzione INSERT.When specified in a table value constructor, DEFAULT is allowed only in an INSERT statement.

expressionexpression
Costante, variabile o espressione.Is a constant, a variable, or an expression. L'espressione non può contenere un'istruzione EXECUTE.The expression cannot contain an EXECUTE statement.

Limitazioni e restrizioniLimitations and Restrictions

Quando usato come tabella derivata non esiste alcun limite per il numero di righe.When used as a derived table, there is no limit to the number of rows.

Quando usato come clausola VALUES di un'istruzione INSERT ... VALUES esiste un limite di 1000 righe.When used as the VALUES clause of an INSERT ... VALUES statement, there is a limit of 1000 rows. Se il numero massimo di righe viene superato, viene restituito l'errore 10738.Error 10738 is returned if the number of rows exceeds the maximum. Per inserire più di 1000 righe, utilizzare uno dei metodi seguenti:To insert more than 1000 rows, use one of the following methods:

Come espressione valore di riga sono consentiti solo valori scalari singoli.Only single scalar values are allowed as a row value expression. Come espressione valore di riga non è consentita una sottoquery che interessa più colonne.A subquery that involves multiple columns is not allowed as a row value expression. Ad esempio, il codice seguente comporta un errore di sintassi perché il terzo elenco di espressioni valore di riga contiene una sottoquery con più colonne.For example, the following code results in a syntax error because the third row value expression list contains a subquery with multiple columns.

USE AdventureWorks2012;  
GO  
CREATE TABLE dbo.MyProducts (Name VARCHAR(50), ListPrice MONEY);  
GO  
-- This statement fails because the third values list contains multiple columns in the subquery.  
INSERT INTO dbo.MyProducts (Name, ListPrice)  
VALUES ('Helmet', 25.50),  
       ('Wheel', 30.00),  
       (SELECT Name, ListPrice FROM Production.Product WHERE ProductID = 720);  
GO  

L'istruzione può tuttavia essere riscritta specificando ogni colonna separatamente nella sottoquery.However, the statement can be rewritten by specifying each column in the subquery separately. Nell'esempio seguente vengono inserite tre righe nella tabella MyProducts senza errori.The following example successfully inserts three rows into the MyProducts table.

INSERT INTO dbo.MyProducts (Name, ListPrice)  
VALUES ('Helmet', 25.50),  
       ('Wheel', 30.00),  
       ((SELECT Name FROM Production.Product WHERE ProductID = 720),  
        (SELECT ListPrice FROM Production.Product WHERE ProductID = 720));  
GO  

Tipi di datiData Types

I valori specificati in un'istruzione INSERT con più righe seguono le proprietà di conversione del tipo di dati della sintassi UNION ALL.The values specified in a multi-row INSERT statement follow the data type conversion properties of the UNION ALL syntax. Ciò comporta la conversione implicita dei tipi non corrispondenti nel tipo con precedenza maggiore.This results in the implicit conversion of unmatched types to the type of higher precedence. Se la conversione non è una conversione implicita supportata, viene generato un errore.If the conversion is not a supported implicit conversion, an error is returned. Nell'istruzione seguente, ad esempio, vengono inseriti un valore integer e un valore di tipo char in una colonna di tipo char.For example, the following statement inserts an integer value and a character value into a column of type char.

CREATE TABLE dbo.t (a INT, b CHAR);  
GO  
INSERT INTO dbo.t VALUES (1,'a'), (2, 1);  
GO  

Quando l'istruzione INSERT viene eseguita, in SQL ServerSQL Server viene effettuato il tentativo di convertire "a" in un numero intero, in quanto la precedenza relativa al tipo di dati indica che un tipo integer è superiore a un tipo char.When the INSERT statement is run, SQL ServerSQL Server tries to convert 'a' to an integer because the data type precedence indicates that an integer is of a higher type than a character. La conversione non riesce e viene restituito un errore.The conversion fails and an error is returned. Per evitare l'errore, è possibile convertire esplicitamente i valori in modo appropriato.You can avoid the error by explicitly converting values as appropriate. L'istruzione precedente, ad esempio, può essere scritta nel modo seguente:For example, the previous statement can be written as follows.

INSERT INTO dbo.t VALUES (1,'a'), (2, CONVERT(CHAR,1));  

EsempiExamples

R.A. Inserimento di più righe di datiInserting multiple rows of data

Nell'esempio seguente viene creata la tabella dbo.Departments e successivamente viene utilizzato il costruttore di valori di tabella per inserire cinque righe nella tabella stessa.The following example creates the table dbo.Departments and then uses the table value constructor to insert five rows into the table. Poiché i valori per tutte le colonne vengono specificati ed elencati nello stesso ordine delle colonne nella tabella, non è necessario specificare i nomi delle colonne nell'elenco delle colonne.Because values for all columns are supplied and are listed in the same order as the columns in the table, the column names do not have to be specified in the column list.

USE AdventureWorks2012;  
GO  
INSERT INTO Production.UnitMeasure  
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923'),
       (N'Y3', N'Cubic Yards', '20080923');  
GO  

B.B. Inserimento di più righe con valori DEFAULT e NULLInserting multiple rows with DEFAULT and NULL values

Nell'esempio seguente viene illustrata la specifica di valori DEFAULT e NULL quando si utilizza il costruttore di valori di tabella per inserire righe in una tabella.The following example demonstrates specifying DEFAULT and NULL when using the table value constructor to insert rows into a table.

USE AdventureWorks2012;  
GO  
CREATE TABLE Sales.MySalesReason(  
SalesReasonID int IDENTITY(1,1) NOT NULL,  
Name dbo.Name NULL ,  
ReasonType dbo.Name NOT NULL DEFAULT 'Not Applicable' );  
GO  
INSERT INTO Sales.MySalesReason   
VALUES ('Recommendation','Other'), ('Advertisement', DEFAULT), (NULL, 'Promotion');  
  
SELECT * FROM Sales.MySalesReason;  

C.C. Specifica di più valori come tabella derivata in una clausola FROMSpecifying multiple values as a derived table in a FROM clause

Negli esempi seguenti viene usato il costruttore di valori di tabella per specificare più valori nella clausola FROM di un'istruzione SELECT.The following examples use the table value constructor to specify multiple values in the FROM clause of a SELECT statement.

SELECT a, b FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);  
GO  
-- Used in an inner join to specify values to return.  
SELECT ProductID, a.Name, Color  
FROM Production.Product AS a  
INNER JOIN (VALUES ('Blade'), ('Crown Race'), ('AWC Logo Cap')) AS b(Name)   
ON a.Name = b.Name;  

D.D. Specifica di più valori come tabella di origine derivata in un'istruzione MERGESpecifying multiple values as a derived source table in a MERGE statement

Nell'esempio seguente viene utilizzata l'istruzione MERGE per modificare la tabella SalesReason eseguendo l'aggiornamento o l'inserimento di righe.The following example uses MERGE to modify the SalesReason table by either updating or inserting rows. Quando il valore di NewName nella tabella di origine corrisponde a un valore della colonna Name nella tabella di destinazione (SalesReason), la colonna ReasonType viene aggiornata nella tabella di destinazione.When the value of NewName in the source table matches a value in the Name column of the target table, (SalesReason), the ReasonType column is updated in the target table. Quando il valore di NewName non corrisponde, la riga di origine viene inserita nella tabella di destinazione.When the value of NewName does not match, the source row is inserted into the target table. La tabella di origine è una tabella derivata che utilizza il costruttore di valori di tabella Transact-SQLTransact-SQL per specificare più righe per la tabella di origine.The source table is a derived table that uses the Transact-SQLTransact-SQL table value constructor to specify multiple rows for the source table.

USE AdventureWorks2012;  
GO  
-- Create a temporary table variable to hold the output actions.  
DECLARE @SummaryOfChanges TABLE(Change VARCHAR(20));  
  
MERGE INTO Sales.SalesReason AS Target  
USING (VALUES ('Recommendation','Other'), ('Review', 'Marketing'), ('Internet', 'Promotion'))  
       AS Source (NewName, NewReasonType)  
ON Target.Name = Source.NewName  
WHEN MATCHED THEN  
UPDATE SET ReasonType = Source.NewReasonType  
WHEN NOT MATCHED BY TARGET THEN  
INSERT (Name, ReasonType) VALUES (NewName, NewReasonType)  
OUTPUT $action INTO @SummaryOfChanges;  
  
-- Query the results of the table variable.  
SELECT Change, COUNT(*) AS CountPerChange  
FROM @SummaryOfChanges  
GROUP BY Change;  

E.E. Inserimento di più di 1000 righeInserting more than 1000 rows

L'esempio seguente illustra l'uso del costruttore di valori di tabella come tabella derivata.The following example demonstrates using the table value constructor as a derived table. Ciò consente l'inserimento di più di 1000 righe da un singolo costruttore di valori di tabella.This allows for inserting more than 1000 rows from a single table value constructor.

CREATE TABLE dbo.Test ([Value] INT);  
  
INSERT INTO dbo.Test ([Value])  
  SELECT drvd.[NewVal]
  FROM   (VALUES (0), (1), (2), (3), ..., (5000)) drvd([NewVal]);

Vedere ancheSee Also

INSERT (Transact-SQL) INSERT (Transact-SQL)
MERGE (Transact-SQL) MERGE (Transact-SQL)
FROM (Transact-SQL)FROM (Transact-SQL)