データの挿入

完了

Transact-SQL には、テーブルに行を挿入する複数の方法があります。

INSERT ステートメント

INSERT ステートメントは、テーブルに 1 つ以上の行を追加するために使用されます。 このステートメントにはいくつかの形式があります。

単純な INSERT ステートメントの基本的な構文を次に示します。

INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)

INSERT VALUES と呼ばれる INSERT ステートメントのこの形式を使用すると、値が配置される列と、テーブルに挿入された各行のデータが表示される順序を指定できます。 column_list は省略可能ですが、使用することをお勧めします。 column_list を指定しないと、INSERT ステートメントでは、テーブル内のすべての列の値を、列が定義された順序になっているものと想定されます。 それらの列の値は、コンマ区切りのリストとして指定することもできます。

値を列記するときのキーワード DEFAULT は、テーブルの作成時に指定された定義済みの値が使用されることを意味します。 既定値を決定するには、3 つの方法があります。

  • 自動的に生成される値を持つように列が定義されている場合は、その値が使用されます。 自動生成値については、このモジュールで後ほど説明します。
  • テーブルを作成するときに、列に既定値を指定することができ、DEFAULT が指定されている場合は、その値が使用されます。
  • 列が NULL 値を許容するように定義されていて、列が自動生成される列ではなく、既定値が定義されていない場合は、NULL が既定値として挿入されます。

テーブルの作成の詳細については、このモジュールでは取り扱いません。 ただし、テーブルに含まれる列を確認すると役に立つことがよくあります。 最も簡単な方法は、行を返さずにテーブルに対して SELECT ステートメントを実行することです。 TRUE にならない WHERE 条件を使用すると、行を返すことはできません。

SELECT * FROM Sales.Promotion
WHERE 1 = 0;

このステートメントを使用すると、すべての列とその名前が表示されますが、Null が許可されるかどうかや、既定値が指定されているかどうかといった、データ型やプロパティは表示されません。 クエリからの出力の例は次のようになります。

PromotionName

StartDate

ProductModelID

Discount

メモ

このテーブルにデータを挿入するには、次に示すように INSERT ステートメントを使用します。

INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

上の例では、正しい順序ですべての列に値を指定しているため、列リストを省略できます。

INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

StartDate 列に今日の日付が既定値として適用され、Notes 列で NULL 値が許容されるように、テーブルが定義されているとします。 次のようにすると、これらの値を明示的に使用することを指定できます。

INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);

または、INSERT ステートメントで値を省略することもできます。その場合、定義されている場合は既定値が使用され、既定値がなくても、列で NULL が許容されている場合は、NULL が挿入されます。 すべての列の値を指定しない場合は、値を指定する列を列リストで示す必要があります。

INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);

一度に 1 つの行を挿入するだけでなく、コンマで区切られた複数の値のセットを指定することによって、INSERT VALUES ステートメントで複数の行を挿入することもできます。 値のセットも、次のようにコンマで区切ります。

(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)

この値のリストは、テーブル値コンストラクターと呼ばれます。 テーブル値コンストラクターを使用してテーブルにさらに 2 つの行を挿入する例を次に示します。

INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);

INSERT ... SELECT

T-SQL の INSERT ステートメントでは、リテラル値のセットを指定する以外に、他の操作の結果を使用して INSERT の値を指定することもできます。 SELECT ステートメントの結果またはストアド プロシージャの出力を使用して、INSERT ステートメントの値を指定できます。

入れ子になった SELECT で INSERT を使用するには、VALUES 句を置き換えるように SELECT ステートメントを作成します。 INSERT SELECT という名前のこの形式を使用すると、SELECT クエリによって返された行のセットを対象のテーブルに挿入できます。 INSERT SELECT を使用するときも、INSERT VALUES と同じ考慮事項があります。

  • 必要に応じて、テーブル名の後に列リストを指定できます。
  • 各列に対し、列の値または DEFAULT または NULL を指定する必要があります。

次の構文は、INSERT SELECT の使用を示したものです。

INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;

注意

ストアド プロシージャ (または動的バッチ) からの結果セットも、INSERT ステートメントへの入力として使用できます。 INSERT EXEC と呼ばれるこの形式の INSERT は、概念的には INSERT SELECT と似ており、同じ考慮事項が適用されます。 ただし、ストアド プロシージャからは複数の結果セットが返される可能性があるため、いっそうの注意が必要です。

次の例では、Production.ProductModel テーブルから名前に "frame" が含まれるすべてのモデルのモデル ID とモデル名を取得することで、Get Framed という名前の新しいキャンペーンに複数の行を挿入しています。

INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount, Notes)
SELECT DISTINCT 'Get Framed', m.ProductModelID, 0.1, '10% off ' + m.Name
FROM Production.ProductModel AS m
WHERE m.Name LIKE '%frame%';

サブクエリとは異なり、INSERT で使用される入れ子になった SELECT はかっこで囲みません。

SELECT ... INTO

行を挿入する、INSERT SELECT に似たもう 1 つのオプションは、SELECT INTO ステートメントです。 INSERT SELECT と SELECT INTO の最大の違いは、SELECT INTO の場合、SELECT の結果に基づいて常に新しいテーブルが作成されるため、既存のテーブルへの行の挿入には使用できないことです。 新しいテーブルの各列の名前、データ型、および NULL 値の許容は、SELECT リスト内の対応する列 (または式) と同じになります。

SELECT INTO を使用するには、クエリの SELECT 句の FROM 句の直前に、INTO <new_table_name> を追加します。 Sales.SalesOrderHeader テーブルから Sales.Invoice という名前の新しいテーブルにデータを抽出する例を次に示します。

SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;

INTO の後で指定されている名前のテーブルが既に存在する場合、SELECT INTO は失敗します。 作成されたテーブルは、他のテーブルと同じように扱うことができます。 そこから選択したり、他のテーブルに結合したり、さらに行を挿入したりすることができます。