Construtor de valor de tabela (Transact-SQL)Table Value Constructor (Transact-SQL)

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure nãoAzure Synapse Analytics (SQL DW) nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Especifica um conjunto de expressões de valores de linha a ser construído em uma tabela.Specifies a set of row value expressions to be constructed into a table. O construtor de valor de tabela Transact-SQLTransact-SQL permite especificar várias linhas de dados em uma única instrução DML.The Transact-SQLTransact-SQL table value constructor allows multiple rows of data to be specified in a single DML statement. O construtor de valor de tabela pode ser especificado como a cláusula VALUES de uma instrução INSERT ... VALUES ou como uma tabela derivada na cláusula USING da instrução MERGE ou na cláusula 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.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

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

ArgumentosArguments

VALUESVALUES
Introduz as listas de expressões de valores de linha.Introduces the row value expression lists. Cada lista deve ser colocada entre parênteses e separada por uma vírgula.Each list must be enclosed in parentheses and separated by a comma.

O número de valores especificados em cada lista deve ser o mesmo e os valores devem estar na mesma ordem das colunas na tabela.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. É necessário especificar um valor para cada coluna na tabela ou a lista de colunas deve especificar explicitamente as colunas para cada valor de entrada.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
Força o Mecanismo de Banco de DadosDatabase Engine a inserir o valor padrão definido para uma coluna.Forces the Mecanismo de Banco de DadosDatabase Engine to insert the default value defined for a column. Se não existir um padrão para a coluna e a coluna aceitar valores nulos, NULL será inserido.If a default does not exist for the column and the column allows null values, NULL is inserted. DEFAULT não é válido para uma coluna de identidade.DEFAULT is not valid for an identity column. Quando especificado em um construtor de valor de tabela, DEFAULT só é permitido em uma instrução INSERT.When specified in a table value constructor, DEFAULT is allowed only in an INSERT statement.

expressãoexpression
É uma constante, uma variável ou uma expressão.Is a constant, a variable, or an expression. A expressão não pode conter uma instrução EXECUTE.The expression cannot contain an EXECUTE statement.

Limitações e RestriçõesLimitations and Restrictions

Quando usado como uma tabela derivada, não há nenhum limite no número de linhas.When used as a derived table, there is no limit to the number of rows.

Quando usado como a cláusula VALUES de uma instrução INSERT ... VALUES, há um limite de 1.000 linhas.When used as the VALUES clause of an INSERT ... VALUES statement, there is a limit of 1000 rows. O erro 10738 será retornado se o número de linhas exceder o máximo.Error 10738 is returned if the number of rows exceeds the maximum. Para inserir mais de 1.000 linhas, use um dos seguintes métodos:To insert more than 1000 rows, use one of the following methods:

Somente são permitidos valores escalares exclusivos como uma expressão de valor de linha.Only single scalar values are allowed as a row value expression. Uma subconsulta que envolve várias colunas não é permitida como uma expressão de valor de linha.A subquery that involves multiple columns is not allowed as a row value expression. Por exemplo, o código a seguir resulta em um erro de sintaxe porque a terceira lista de expressões de valores de linha contém uma subconsulta com várias colunas.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  

Entretanto, a instrução pode ser reescrita especificando cada coluna separadamente na subconsulta.However, the statement can be rewritten by specifying each column in the subquery separately. O exemplo a seguir insere com êxito três linhas na tabela MyProducts.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  

Tipos de dadosData Types

Os valores especificados em uma instrução INSERT de várias linhas seguem as propriedades de conversão de tipos de dados da sintaxe UNION ALL.The values specified in a multi-row INSERT statement follow the data type conversion properties of the UNION ALL syntax. Isso resulta na conversão implícita de tipos não correspondentes no tipo de precedência mais alta.This results in the implicit conversion of unmatched types to the type of higher precedence. Se a conversão não for uma conversão implícita com suporte, um erro será retornado.If the conversion is not a supported implicit conversion, an error is returned. Por exemplo, a instrução a seguir insere um valor inteiro e um valor de caractere em uma coluna do 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 a instrução INSERT for executada, o SQL ServerSQL Server tentará converter 'a' em um inteiro porque a precedência de tipo de dados indica que um inteiro é de um tipo mais alto do que um caractere.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. A conversão falhará e um erro será retornado.The conversion fails and an error is returned. Para evitar o erro, converta explicitamente os valores conforme apropriado.You can avoid the error by explicitly converting values as appropriate. Por exemplo, a instrução anterior pode ser escrita da seguinte maneira.For example, the previous statement can be written as follows.

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

ExemplosExamples

A.A. Inserindo várias linhas de dadosInserting multiple rows of data

O exemplo a seguir cria a tabela dbo.Departments e usa o construtor de valor de tabela para inserir cinco linhas na tabela.The following example creates the table dbo.Departments and then uses the table value constructor to insert five rows into the table. Como os valores de todas as colunas são fornecidos e listados na mesma ordem que as colunas da tabela, os nomes das colunas não precisam ser especificados na lista de colunas.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. Inserindo várias linhas com valores DEFAULT e NULLInserting multiple rows with DEFAULT and NULL values

O exemplo a seguir demonstra como especificar DEFAULT e NULL ao usar o construtor de valor de tabela para inserir linhas em uma tabela.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. Especificando vários valores como uma tabela derivada em uma cláusula FROMSpecifying multiple values as a derived table in a FROM clause

Os exemplos a seguir usam o construtor de valor de tabela para especificar vários valores na cláusula FROM de uma instrução 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. Especificando vários valores como uma tabela de origem derivada em uma instrução MERGESpecifying multiple values as a derived source table in a MERGE statement

O exemplo a seguir usa MERGE para modificar a tabela SalesReason atualizando ou inserindo linhas.The following example uses MERGE to modify the SalesReason table by either updating or inserting rows. Quando o valor de NewName na tabela de origem corresponde a um valor na coluna Name da tabela de destino (SalesReason), a coluna ReasonType é atualizada na tabela de destino.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 o valor de NewName não corresponde, a linha de origem é inserida na tabela de destino.When the value of NewName does not match, the source row is inserted into the target table. A tabela de origem é uma tabela derivada que usa o construtor de valor de tabela do Transact-SQLTransact-SQL para especificar várias linhas para a tabela de origem.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. Como inserir mais de 1.000 linhasInserting more than 1000 rows

O exemplo a seguir demonstra como usar o construtor de valor de tabela como uma tabela derivada.The following example demonstrates using the table value constructor as a derived table. Isso permite a inserção de mais de 1.000 linhas de um único construtor de valor de tabela.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]);

Consulte TambémSee Also

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