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文で複数のデータを挿入する方法でした。