Constructor con valores de tabla (Transact-SQL)Table Value Constructor (Transact-SQL)

SE APLICA A: síSQL Server síAzure SQL Database noAzure Synapse Analytics (SQL DW) noAlmacenamiento de datos paralelosAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Especifica un conjunto de expresiones de valores de fila que se va a construir en una tabla.Specifies a set of row value expressions to be constructed into a table. El constructor de valor de tabla de Transact-SQLTransact-SQL permite que se especifiquen varias filas de datos en una sola instrucción DML.The Transact-SQLTransact-SQL table value constructor allows multiple rows of data to be specified in a single DML statement. El constructor del valor de la tabla se puede especificar como la cláusula VALUES de una instrucción INSERT ... VALUES o como una tabla derivada en la cláusula USING de la instrucción MERGE o en la 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.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

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

ArgumentosArguments

VALUESVALUES
Introduce las listas de expresión de los valores de las filas.Introduces the row value expression lists. Cada lista debe aparecer entre paréntesis y separarse mediante una coma.Each list must be enclosed in parentheses and separated by a comma.

El número de valores especificados en cada lista debe ser el mismo y los valores deben estar en el mismo orden que las columnas de la tabla.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. Se debe especificar un valor para cada columna de la tabla o la lista de columnas debe especificar explícitamente las columnas para cada valor entrante.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
Hace que Motor de base de datosDatabase Engine inserte el valor predeterminado definido para una columna.Forces the Motor de base de datosDatabase Engine to insert the default value defined for a column. Si no existe ningún valor predeterminado para la columna y esta admite valores NULL, se inserta NULL.If a default does not exist for the column and the column allows null values, NULL is inserted. DEFAULT no es un valor válido para una columna de identidad.DEFAULT is not valid for an identity column. Cuando se especifica en un constructor con valores de tabla, DEFAULT solo se permite en una instrucción INSERT.When specified in a table value constructor, DEFAULT is allowed only in an INSERT statement.

expressionexpression
Es una constante, variable o expresión.Is a constant, a variable, or an expression. La expresión no puede contener una instrucción EXECUTE.The expression cannot contain an EXECUTE statement.

Limitaciones y restriccionesLimitations and Restrictions

Cuando se usa como una tabla derivada, no hay ningún límite en el número de filas.When used as a derived table, there is no limit to the number of rows.

Cuando se usa como la cláusula VALUES de una instrucción INSERT ... VALUES, el límite es de 1000 filas.When used as the VALUES clause of an INSERT ... VALUES statement, there is a limit of 1000 rows. Si el número de filas supera el máximo, se devuelve el error 10738.Error 10738 is returned if the number of rows exceeds the maximum. Para insertar más de 1000 filas, use uno de los métodos siguientes:To insert more than 1000 rows, use one of the following methods:

Como expresión de valores de fila solo se permiten valores escalares.Only single scalar values are allowed as a row value expression. Como expresión de valores de fila no se permiten las subconsultas que impliquen a varias columnas.A subquery that involves multiple columns is not allowed as a row value expression. Por ejemplo, el código siguiente produce un error de sintaxis porque la tercera lista de expresiones de valores de fila contiene una subconsulta con varias columnas.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  

Sin embargo, la instrucción se puede reescribir especificando cada columna en la subconsulta independientemente.However, the statement can be rewritten by specifying each column in the subquery separately. El ejemplo siguiente inserta correctamente tres filas en la tabla 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  

Tipo de datosData Types

Los valores especificados en una instrucción INSERT de varias filas siguen las propiedades de conversión de tipos de datos de la sintaxis de UNION ALL.The values specified in a multi-row INSERT statement follow the data type conversion properties of the UNION ALL syntax. Esto produce la conversión implícita de tipos no coincidentes al tipo de precedencia superior.This results in the implicit conversion of unmatched types to the type of higher precedence. Si la conversión no es una conversión implícita admitida, se devuelve un error.If the conversion is not a supported implicit conversion, an error is returned. Por ejemplo, la instrucción siguiente inserta un valor entero y un valor de carácter en una columna de 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  

Cuando se ejecuta la instrucción INSERT, SQL ServerSQL Server intenta convertir 'a' en un entero porque la precedencia del tipo de datos indica que un entero pertenece a un tipo más alto que un carácter.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. Se produce un error en la conversión y se devuelve un error.The conversion fails and an error is returned. Para evitar este error, puede convertir explícitamente los valores según corresponda.You can avoid the error by explicitly converting values as appropriate. Por ejemplo, la instrucción anterior puede escribirse del siguiente modo.For example, the previous statement can be written as follows.

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

EjemplosExamples

A.A. Insertar varias filas de datosInserting multiple rows of data

En el siguiente ejemplo se crea la tabla dbo.Departments y, a continuación, se utiliza el constructor de valor de tabla para insertar cinco filas en la tabla.The following example creates the table dbo.Departments and then uses the table value constructor to insert five rows into the table. Dado que los valores para todas las columnas se suministran e incluyen en el mismo orden que las columnas de la tabla, no es necesario especificar los nombres de columna en la lista de columnas.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. Insertar varias filas con los valores DEFAULT y NULLInserting multiple rows with DEFAULT and NULL values

En el siguiente ejemplo se demuestra cómo especificar DEFAULT y NULL cuando se utiliza el constructor de valor de tabla para insertar filas en una tabla.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. Especificar varios valores como una tabla derivada en una cláusula FROMSpecifying multiple values as a derived table in a FROM clause

En los siguientes ejemplos se usa el constructor con valores de tabla para especificar varios valores en la cláusula FROM de una instrucción 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. Especificar varios valores como una tabla de origen derivada en una instrucción MERGESpecifying multiple values as a derived source table in a MERGE statement

En el ejemplo siguiente se usa MERGE para modificar la tabla SalesReason, actualizando o insertando las filas.The following example uses MERGE to modify the SalesReason table by either updating or inserting rows. Cuando el valor de NewName de la tabla de origen coincide con un valor de la columna Name de la tabla de destino, (SalesReason), la columna ReasonType se actualiza en la tabla 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. Cuando el valor de NewName no coincide, la fila del origen se inserta en la tabla de destino.When the value of NewName does not match, the source row is inserted into the target table. La tabla de origen es una tabla derivada que usa la característica de constructor con valores de tabla de Transact-SQLTransact-SQL para especificar varias filas en la tabla de origen.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. Insertar más de 1000 filasInserting more than 1000 rows

En el ejemplo siguiente se muestra cómo utilizar el constructor con valores de tabla como una tabla derivada.The following example demonstrates using the table value constructor as a derived table. Esto permite insertar más de 1000 filas desde un constructor con valores de tabla única.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 tambiénSee Also

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