SQLServer(T-SQL)で1行のINSERT文で複数のデータを挿入する方法

SQLServer(T-SQL)で1行のInsert文で複数件のデータを一気に挿入することはできないのでしょうか?

実はSQLServer(T-SQL)で1行のINSERT文で複数件挿入するには「VALUES以降をカンマで区切って」渡せば挿入できます。

ただし挿入できるのは最大1000行までです。

それ以上の場合はINSERT文を分けて実行する必要があります。

具体的には通常のInsert文のVALUES以降を「,(カンマ)」で続けて書いていくことで可能になります。

INSERT INTO test_table VALUES
     ( 1, 'NAME1', 10 )
    ,( 2, 'NAME2', 20 )
    ,...

注意としては1つでもエラーの発生するVALUESが存在すると、すべてのデータが挿入がCommit(コミット)されずRollBack(ロールバック)されてしまいます。(1件のデータも挿入されないことになります。)

以下に具体的な利用方法を解説します。

スポンサーリンク

1行のINSERTで複数件のデータ挿入

これまでは1行INSERT文では1行のデータしか挿入できませんでしたが、SQLServer2008では1行のINSERT文で複数件を挿入できます。

1行のINSERT文で複数件挿入するには「VALUES以降をカンマで区切って」わたせばそうにゅうできます渡します。

複数行のINSERT文で複数件のデータ挿入

通常はテーブルに複数件挿入する場合は以下の様にINSERT文を複数件書いて実行します。

INSERT INTO test_table VALUES ( 1, 'NAME1', 10 )
INSERT INTO test_table VALUES ( 2, 'NAME2', 20 )
INSERT INTO test_table VALUES ( 3, 'NAME3', 30 )
INSERT INTO test_table VALUES ( 4, 'NAME4', 40 )
INSERT INTO test_table VALUES ( 5, 'NAME5', 50 )

以下が挿入後の検索結果です。

seq name   num
1   NAME1   10
2   NAME2   20
3   NAME3   30
4   NAME4   40
5   NAME5   50

1行のINSERT文で複数件データ挿入

SQLServer2008で実行できるようになった1行のINSERT文で複数件挿入する
SQLは「VALUES以降をカンマで区切って」渡せば挿入できます。

INSERT INTO test_table VALUES
     ( 1, 'NAME1', 10 )
    ,( 2, 'NAME2', 20 )
    ,( 3, 'NAME3', 30 )
    ,( 4, 'NAME4', 40 )
    ,( 5, 'NAME5', 50 )

以下が挿入後の検索結果です。

seq name   num
1   NAME1   10
2   NAME2   20
3   NAME3   30
4   NAME4   40
5   NAME5   50

挿入できるのは最大1000行までとHELPにありますので、それ以上の場合はINSERT文を分けて実行する必要があります。

1行のINSERT文で複数件データ挿入時のエラー動作

はじめに複数行でINSERTする場合を検証します。
わざとエラーになうように、3行目でint型にVARCHAR型を入れてあります。

INSERT INTO test_table VALUES ( 1, 'NAME1', 10 )
INSERT INTO test_table VALUES ( 2, 'NAME2', 20 )
INSERT INTO test_table VALUES ( 'A', 'NAME3', 30 )
INSERT INTO test_table VALUES ( 4, 'NAME4', 40 )
INSERT INTO test_table VALUES ( 5, 'NAME5', 50 )

実行結果は

(1 行処理されました)

(1 行処理されました)
メッセージ 245、レベル 16、状態 1、行 3
varchar の値 'A' をデータ型 int に変換できませんでした。

になります。

テーブルをSELECTすると

seq  name  num
1    NAME1  10
2    NAME2  20

となり、エラー発生後のデータはテーブルに挿入されていません。

次に1行のINSERT文で複数件挿入するSQLでエラーになる行を含む行があった場合にどうなるかを検証します。
これも同じ様に、わざとエラーになうように、3行目でint型にVARCHAR型を入れてあります。

INSERT INTO test_table VALUES
     ( 1, 'NAME1', 10 )
    ,( 2, 'NAME2', 20 )
    ,( 'A', 'NAME3', 30 )
    ,( 4, 'NAME4', 40 )
    ,( 5, 'NAME5', 50 )

実行結果は

メッセージ 245、レベル 16、状態 1、行 1
varchar の値 'A' をデータ型 int に変換できませんでした。

エラー発生後にテーブルを検索してみても

SELECT * FROM test_table
seq name   num

行が1行も選択されないので、エラー行を含む場合は1行のINSERTで複数件挿入する場合は「全行のデータが挿入されない」というこになります。

1行なので当然なのですが注意が必要です。

データの整合性を保つために全件RollBack(ロールバック)された方が都合が良い場合に有効な機能ですね。

以上、1行のINSERT文で複数のデータを挿入する方法でした。

sqlite3で1行のINSERT文で複数のデータを挿入する方法
sqlite3で1行のINSERT文で複数のデータをPythonで同時に挿入するにはexecutemany()メソッドを利用します。
タイトルとURLをコピーしました