web-dev-qa-db-fra.com

SQL Server Nombre maximal de lignes pouvant être insérées dans une seule instruction d'insertion

Je veux faire un insert de lot, similaire à cette question

Comment faire une insertion par lots dans MySQL

  1. Quelle est la limitation de SQL Server sur le nombre de lignes pouvant être insérées dans une seule instruction d'insertion?

  2. Que se passe-t-il lorsque, par exemple, la première valeur est insérée mais que la seconde provoque une violation de clé primaire. Les instructions all INSERT sont-elles annulées?

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

Le nombre maximal de lignes que vous pouvez insérer dans une instruction est de 1000 lorsque vous utilisez INSERT INTO ... VALUES... c'est à dire.

INSERT INTO TableName( Colum1)
VALUES (1),
       (2),
       (3),...... upto 1000 rows. 

Mais si vous utilisez une instruction SELECT pour insérer des lignes dans une table, il n'y a pas de limite, quelque chose comme ...

INSERT INTO TableName (ColName)
Select Col FROM AnotherTable

Venons-en maintenant à votre deuxième question. Que se passe-t-il lorsqu'une erreur se produit lors d'une insertion.

Eh bien, si vous insérez des lignes à l'aide d'une construction à valeurs multiples

INSERT INTO TableName( Colum1)
VALUES (1),
       (2),
       (3)

Dans le scénario ci-dessus, si une insertion de ligne provoque une erreur, l'instruction entière sera annulée et aucune des lignes ne sera insérée.

Mais si vous insérez des lignes avec une instruction distincte pour chaque ligne, c'est-à-dire ...

INSERT INTO TableName( Colum1) VALUES (1)
INSERT INTO TableName( Colum1) VALUES (2)
INSERT INTO TableName( Colum1) VALUES (3)

Dans le cas ci-dessus, chaque insertion de ligne est une instruction distincte et si une insertion de ligne a provoqué une erreur, seule cette instruction d'insertion spécifique sera annulée, le reste sera correctement inséré.

21
M.Ali

Bien que le maximum soit de 1000, il a été démontré que les performances commencent à diminuer à des nombres beaucoup plus petits. Eugene Philipov a écrit un excellent article sur ce sujet:

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

Pour résumer, l'auteur a fait des expériences très bien conçues et a trouvé un sweet spot à environ 25 . YMMV.

1
Todd Menier

Vous pouvez réellement transmettre un nombre illimité d'enregistrements à l'aide d'une sous-requête.

;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