Tabellenwertkonstruktor (Transact-SQL)Table Value Constructor (Transact-SQL)

GILT FÜR: jaSQL ServerjaAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Gibt eine Gruppe mit Zeilenwertausdrücken an, die in einer Tabelle erstellt werden sollen.Specifies a set of row value expressions to be constructed into a table. Der Transact-SQLTransact-SQL-Tabellenwertkonstruktor ermöglicht das Angeben mehrerer Datenzeilen in nur einer DML-Anweisung.The Transact-SQLTransact-SQL table value constructor allows multiple rows of data to be specified in a single DML statement. Der Tabellenwertkonstruktor kann entweder als die VALUES-Klausel einer INSERT ... VALUES-Anweisung oder als eine abgeleitete Tabelle in der USING-Klausel der MERGE-Anweisung oder der FROM-Klausel angegeben werden.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.

Themenlinksymbol Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

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

ArgumenteArguments

VALUESVALUES
Bietet eine Einführung in die Zeilenwertausdruckslisten.Introduces the row value expression lists. Die einzelnen Listen müssen in Klammern gesetzt und durch ein Trennzeichen getrennt werden.Each list must be enclosed in parentheses and separated by a comma.

Die Anzahl der in jeder Liste angegebenen Werte muss übereinstimmen, und die Werte müssen in der gleichen Reihenfolge wie die Spalten in der Tabelle vorliegen.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. Für jede Spalte in der Tabelle muss ein Wert angegeben werden, oder in der Spaltenliste müssen explizit die Spalten für jeden eingehenden Wert angegeben werden.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
Erzwingt, dass Datenbank-EngineDatabase Engine den für eine Spalte definierten Standardwert einfügt.Forces the Datenbank-EngineDatabase Engine to insert the default value defined for a column. Wenn für die Spalte kein Standardwert vorhanden ist und die Spalte NULL-Werte zulässt, wird NULL eingefügt.If a default does not exist for the column and the column allows null values, NULL is inserted. DEFAULT ist für eine Identitätsspalte nicht zulässig.DEFAULT is not valid for an identity column. Wenn DEFAULT in einem Tabellenwertkonstruktor angegeben wird, ist diese Variable nur in einer INSERT-Anweisung zulässig.When specified in a table value constructor, DEFAULT is allowed only in an INSERT statement.

expressionexpression
Eine Konstante, eine Variable oder ein Ausdruck.Is a constant, a variable, or an expression. Der Ausdruck darf keine EXECUTE-Anweisung enthalten.The expression cannot contain an EXECUTE statement.

EinschränkungenLimitations and Restrictions

Bei Verwendung als abgeleitete Tabelle gibt es keine Beschränkung für die Anzahl der Zeilen.When used as a derived table, there is no limit to the number of rows.

Bei Verwendung als VALUES-Klausel einer INSERT ... VALUES-Anweisung gilt ein Grenzwert von 1.000 Zeilen.When used as the VALUES clause of an INSERT ... VALUES statement, there is a limit of 1000 rows. Fehler 10738 wird zurückgegeben, wenn die Anzahl der Zeilen in diesem Fall das Maximum übersteigt.Error 10738 is returned if the number of rows exceeds the maximum. Um mehr als 1.000 Zeilen einzufügen, verwenden Sie eine der folgenden Methoden:To insert more than 1000 rows, use one of the following methods:

Nur einzelne Skalarwerte sind als Zeilenwertausdruck zulässig.Only single scalar values are allowed as a row value expression. Eine Unterabfrage, die mehrere Spalten umfasst, ist nicht als Zeilenwertausdruck zulässig.A subquery that involves multiple columns is not allowed as a row value expression. Der folgende Code verursacht z. B. einen Syntaxfehler, weil die dritte Zeilenwertausdrucksliste eine Unterabfrage mit mehreren Spalten enthält.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  

Die Anweisung kann jedoch umgeschrieben werden, indem jede Spalte getrennt in der Unterabfrage angegeben wird.However, the statement can be rewritten by specifying each column in the subquery separately. Im folgenden Beispiel werden drei Zeilen erfolgreich in die MyProducts-Tabelle eingefügt.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  

DatentypenData Types

Die in einer aus mehreren Zeilen bestehenden INSERT-Anweisung angegebenen Werte befolgen die Datentypkonvertierungseigenschaften der UNION ALL-Syntax.The values specified in a multi-row INSERT statement follow the data type conversion properties of the UNION ALL syntax. Dies führt zur impliziten Konvertierung nicht übereinstimmender Typen in den Typ, der in der Rangfolge höher steht.This results in the implicit conversion of unmatched types to the type of higher precedence. Wenn es sich bei der Konvertierung nicht um eine unterstützte implizite Konvertierung handelt, gibt das System einen Fehler zurück.If the conversion is not a supported implicit conversion, an error is returned. In der folgenden Anweisung werden beispielsweise ein ganzzahliger Wert und ein Zeichenwert in eine Spalte vom Typ char eingefügt.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  

Bei Ausführung der INSERT-Anweisung versucht SQL ServerSQL Server, "a" in eine ganze Zahl zu konvertieren, da die Rangfolge der Datentypen angibt, dass eine ganze Zahl einen höherrangigen Typ hat als ein Zeichen.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. Die Konvertierung schlägt fehl, und es wird ein Fehler zurückgegeben.The conversion fails and an error is returned. Sie können den Fehler vermeiden, indem Sie Werte nach Bedarf explizit konvertieren.You can avoid the error by explicitly converting values as appropriate. Die vorherige Anweisung kann beispielsweise folgendermaßen geschrieben werden.For example, the previous statement can be written as follows.

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

BeispieleExamples

A.A. Einfügen mehrerer DatenzeilenInserting multiple rows of data

Im folgenden Beispiel wird die dbo.Departments-Tabelle erstellt; anschließend werden unter Verwendung des Tabellenwertkonstruktors fünf Zeilen in die Tabelle eingefügt.The following example creates the table dbo.Departments and then uses the table value constructor to insert five rows into the table. Da Werte für alle Spalten bereitgestellt werden und in der Reihenfolge der Spalten in der Tabelle aufgelistet sind, müssen die Spaltennamen nicht in der Spaltenliste angegeben werden.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. Einfügen mehrerer Zeilen mit DEFAULT- und NULL-WertenInserting multiple rows with DEFAULT and NULL values

Im folgenden Beispiel wird das Angeben von DEFAULT und NULL gezeigt, wenn mithilfe des Tabellenwertkonstruktors Zeilen in eine Tabelle eingefügt werden.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. Angeben mehrerer Werte als abgeleitete Tabelle in einer FROM-KlauselSpecifying multiple values as a derived table in a FROM clause

In den folgenden Beispielen dient der Tabellenwertkonstruktor zur Angabe mehrerer Werte in der FROM-Klausel einer SELECT-Anweisung.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. Angeben mehrerer Werte als abgeleitete Quelltabelle in einer MERGE-AnweisungSpecifying multiple values as a derived source table in a MERGE statement

Im folgenden Beispiel wird die SalesReason-Tabelle durch das Aktualisieren oder Einfügen von Zeilen mithilfe von MERGE geändert.The following example uses MERGE to modify the SalesReason table by either updating or inserting rows. Wenn der Wert von NewName in der Quelltabelle einem Wert in der Name-Spalte der Zieltabelle entspricht (SalesReason), wird die ReasonType-Spalte in der Zieltabelle aktualisiert.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. Wenn der Wert von NewName jedoch nicht übereinstimmt, wird die Quellzeile in die Zieltabelle eingefügt.When the value of NewName does not match, the source row is inserted into the target table. Die Quelltabelle ist eine abgeleitete Tabelle, die mithilfe des Transact-SQLTransact-SQL-Tabellenwertkonstruktors mehrere Zeilen für die Quelltabelle angibt.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. Einfügen von mehr als 1.000 ZeilenInserting more than 1000 rows

Im folgenden Beispiel wird die Verwendung des Tabellenwertkonstruktors als abgeleitete Tabelle veranschaulicht.The following example demonstrates using the table value constructor as a derived table. Dies ermöglicht das Einfügen von mehr als 1.000 Zeilen aus einem einzelnen Tabellenwertkonstruktor.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]);

Weitere InformationenSee Also

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