web-dev-qa-db-ja.com

SQL Server単一の挿入ステートメントに挿入できる最大行

この質問に似たバッチ挿入をしたい

MySQLでバッチ挿入を行う方法

  1. 単一の挿入ステートメントに挿入できる行数に関するSQL Serverの制限は何ですか?

  2. たとえば、最初の値が挿入され、2番目の値が主キー違反を引き起こした場合にどうなりますか。すべてのINSERTステートメントはロールバックされていますか?

INSERT INTO tbl_name (a,b) 
VALUES (1, 2), (1, 3));
13
Shachaf.Gortler

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)

上記の場合、各行挿入は個別のステートメントであり、行挿入がエラーを引き起こした場合、その特定の挿入ステートメントのみがロールバックされ、残りは正常に挿入されます。

21
M.Ali

最大は1000ですが、はるかに少ない数でパフォーマンスが低下し始めることが実証されています。 Eugene Philipovは、まさにこのトピックを探る素晴らしい記事を書きました。

https://www.red-gate.com/simple-talk/sql/performance/comparing-multiple-rows-insert-vs-single-row-insert-with-three-data-load-methods/

要約すると、著者は非常にうまく設計された実験をいくつか行い、約25にスイートスポットを見つけました。 YMMV。

1
Todd Menier

実際には、サブクエリを使用して無制限の数のレコードを渡すことができます。

;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
1
Dutchman