この質問に似たバッチ挿入をしたい
単一の挿入ステートメントに挿入できる行数に関するSQL Serverの制限は何ですか?
たとえば、最初の値が挿入され、2番目の値が主キー違反を引き起こした場合にどうなりますか。すべてのINSERT
ステートメントはロールバックされていますか?
INSERT INTO tbl_name (a,b)
VALUES (1, 2), (1, 3));
INSERT INTO ... VALUES...
を使用する場合、1つのステートメントに挿入できる最大行数は1000です。
INSERT INTO TableName( Colum1)
VALUES (1),
(2),
(3),...... upto 1000 rows.
しかし、テーブルに行を挿入するためにSELECTステートメントを使用している場合、そのような制限はありません。
INSERT INTO TableName (ColName)
Select Col FROM AnotherTable
2番目の質問に来ます。挿入中にエラーが発生するとどうなりますか。
多値構成を使用して行を挿入する場合
INSERT INTO TableName( Colum1)
VALUES (1),
(2),
(3)
上記のシナリオでは、行の挿入によってエラーが発生した場合、ステートメント全体がロールバックされ、行は挿入されません。
ただし、行ごとに個別のステートメントを使用して行を挿入する場合、つまり...
INSERT INTO TableName( Colum1) VALUES (1)
INSERT INTO TableName( Colum1) VALUES (2)
INSERT INTO TableName( Colum1) VALUES (3)
上記の場合、各行挿入は個別のステートメントであり、行挿入がエラーを引き起こした場合、その特定の挿入ステートメントのみがロールバックされ、残りは正常に挿入されます。
最大は1000ですが、はるかに少ない数でパフォーマンスが低下し始めることが実証されています。 Eugene Philipovは、まさにこのトピックを探る素晴らしい記事を書きました。
要約すると、著者は非常にうまく設計された実験をいくつか行い、約25にスイートスポットを見つけました。 YMMV。
実際には、サブクエリを使用して無制限の数のレコードを渡すことができます。
;WITH NewData AS (SELECT * FROM ( VALUES (1, 'A'),(2,'B'),(3,'C')) x (Id, SomeName))
INSERT INTO TableName (Column1, Column2) SELECT Id, SomeName FROM NewData