テーブル値コンストラクター (Transact-SQL)Table Value Constructor (Transact-SQL)

適用対象: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

テーブルに設定される行の値式のセットを指定します。Specifies a set of row value expressions to be constructed into a table. Transact-SQLTransact-SQL テーブル値コンストラクターを使用すると、単一の DML ステートメントで複数行のデータを指定できます。The Transact-SQLTransact-SQL table value constructor allows multiple rows of data to be specified in a single DML statement. テーブル値コンストラクターは、INSERT ... VALUES ステートメントの VALUES 句として、または MERGE ステートメントの USING 句または 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.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

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

引数Arguments

VALUESVALUES
行の値式のリストを指定します。Introduces the row value expression lists. 各リストはかっこで囲み、コンマで区切る必要があります。Each list must be enclosed in parentheses and separated by a comma.

各リストで指定されている値の数が同じであり、値はテーブル内の列と同じ順序で並んでいる必要があります。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. テーブル内の各列に対応する値を指定するか、列リストを使用して各入力値を格納する列を明示的に指定する必要があります。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
データベース エンジンDatabase Engineによって、列に対して定義されている既定値が挿入されます。Forces the データベース エンジンDatabase Engine to insert the default value defined for a column. 既定値がなく、列に対して NULL が許可されている場合は、NULL が挿入されます。If a default does not exist for the column and the column allows null values, NULL is inserted. DEFAULT は ID 列には有効ではありません。DEFAULT is not valid for an identity column. テーブル値コンストラクターで指定する場合、DEFAULT は INSERT ステートメント内でのみ使用できます。When specified in a table value constructor, DEFAULT is allowed only in an INSERT statement.

式 (expression)expression
定数、変数、または式を指定します。Is a constant, a variable, or an expression. 式には EXECUTE ステートメントを含めることができません。The expression cannot contain an EXECUTE statement.

制限事項と制約事項Limitations and Restrictions

派生テーブルとして使用した場合、行数に制限はありません。When used as a derived table, there is no limit to the number of rows.

INSERT ... VALUES ステートメントの VALUES 句として使用するときは、1000 行の制限があります。When used as the VALUES clause of an INSERT ... VALUES statement, there is a limit of 1000 rows. 行数が最大値を超えると、エラー 10738 が返されます。Error 10738 is returned if the number of rows exceeds the maximum. 1000 より多くの行を挿入するには、次のいずれかの方法を使用します。To insert more than 1000 rows, use one of the following methods:

単一のスカラー値だけが行の値式として使用できます。Only single scalar values are allowed as a row value expression. 複数の列が関係するサブクエリは行の値式として使用できません。A subquery that involves multiple columns is not allowed as a row value expression. たとえば、次のコードでは、3 番目の行の値式のリストに複数の列を持つサブクエリが含まれているため、構文エラーが返されます。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  

ただし、このステートメントは、サブクエリ内の各列を個別に指定するように書き直すことができます。However, the statement can be rewritten by specifying each column in the subquery separately. 次の例では、MyProducts テーブルに 3 つの行が正常に挿入されます。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  

データ型Data Types

複数行の INSERT ステートメントで指定された値は、UNION ALL 構文のデータ型変換プロパティに従います。The values specified in a multi-row INSERT statement follow the data type conversion properties of the UNION ALL syntax. この結果、一致しない型は、優先順位の高い型に暗黙的に変換されます。This results in the implicit conversion of unmatched types to the type of higher precedence. 暗黙的な変換がサポートされていない場合は、エラーが返されます。If the conversion is not a supported implicit conversion, an error is returned. たとえば、次のステートメントでは、整数値と文字値が、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  

INSERT ステートメントが実行されると、SQL ServerSQL Server では "a" を整数に変換しようとします。データ型の優先順位では、文字型よりも整数型の優先順位が高いことが示されているからです。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. 変換は失敗して、エラーが返されます。The conversion fails and an error is returned. 必要に応じて値を明示的に変換することで、このようなエラーを回避できます。You can avoid the error by explicitly converting values as appropriate. たとえば、上記のステートメントは次のように記述できます。For example, the previous statement can be written as follows.

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

使用例Examples

A.A. 複数行のデータを挿入するInserting multiple rows of data

次の例では、テーブル dbo.Departments を作成し、テーブル値コンストラクターを使用して、そのテーブルに 5 行を挿入します。The following example creates the table dbo.Departments and then uses the table value constructor to insert five rows into the table. すべての列の値が指定され、テーブルの列と同じ順序で並んでいるため、列名を列リストで指定する必要はありません。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. DEFAULT 値および NULL 値を指定して複数行を挿入するInserting multiple rows with DEFAULT and NULL values

次の例では、テーブル値コンストラクターを使用してテーブルに行を挿入するときに、DEFAULT および NULL を指定する方法を示します。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. FROM 句で複数の値を派生テーブルとして指定するSpecifying multiple values as a derived table in a FROM clause

次の例では、テーブル値コンストラクターを使用して SELECT ステートメントの FROM 句で複数の値を指定します。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. MERGE ステートメントで複数の行を派生ソース テーブルとして指定するSpecifying multiple values as a derived source table in a MERGE statement

次の例では、MERGE を使用し、行を更新または挿入することで SalesReason テーブルを変更します。The following example uses MERGE to modify the SalesReason table by either updating or inserting rows. ソース テーブルの NewName の値が対象テーブル (SalesReason) の Name 列の値と一致すると、対象テーブルの ReasonType 列が更新されます。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. NewName の値が一致しない場合は、ソース行が対象テーブルに挿入されます。When the value of NewName does not match, the source row is inserted into the target table. ソース テーブルは、Transact-SQLTransact-SQL テーブル値コンストラクターを使用して複数の行を指定する派生テーブルです。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. 1,000 を超える行を挿入するInserting more than 1000 rows

次の例では、派生テーブルとしてテーブル値コンストラクターを使用する方法を示します。The following example demonstrates using the table value constructor as a derived table. これにより、1 つのテーブル値コンストラクターから 1,000 より多くの行を挿入できます。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]);

参照See Also

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