SQL Server可以插入单个插入语句中的最大行数

Sha*_*ler 13 sql sql-server sql-server-2012

我想做一个批量插入,类似于这个问题

如何在MySQL中进行批量插入

  1. SQL Server是否可以在单个insert语句中插入多少行?

  2. 例如,插入第一个值但第二个值导致主键违规时会发生什么.这些INSERT陈述是否已回滚?

INSERT INTO tbl_name (a,b) 
VALUES (1, 2), (1, 3));
Run Code Online (Sandbox Code Playgroud)

M.A*_*Ali 23

使用INSERT INTO ... VALUES...ie 时,可以在一个语句中插入的最大行数为1000

INSERT INTO TableName( Colum1)
VALUES (1),
       (2),
       (3),...... upto 1000 rows. 
Run Code Online (Sandbox Code Playgroud)

但是如果您使用SELECT语句在表中插入行,则没有限制,例如......

INSERT INTO TableName (ColName)
Select Col FROM AnotherTable
Run Code Online (Sandbox Code Playgroud)

现在来看你的第二个问题.插入过程中发生错误时会发生什么.

好吧,如果你使用多值构造插入行

INSERT INTO TableName( Colum1)
VALUES (1),
       (2),
       (3)
Run Code Online (Sandbox Code Playgroud)

在上面的场景中,如果任何行插入导致错误,则将回滚整个语句,并且不会插入任何行.

但是如果你为每一行插入带有单独语句的行,即......

INSERT INTO TableName( Colum1) VALUES (1)
INSERT INTO TableName( Colum1) VALUES (2)
INSERT INTO TableName( Colum1) VALUES (3)
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,每个行插入都是一个单独的语句,如果任何行插入只导致错误,那么特定的插入语句将被回滚,其余的将被成功插入.

  • 如果你在答案中包含一个链接到文档的链接会很好,其中每个`INSERT .. VALUES`的限制为1000行:[表值构造函数](https://msdn.microsoft.com/en-us/库/ dd776382.aspx) (4认同)

Dut*_*man 7

您实际上可以使用子查询传入无限数量的记录。

;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
Run Code Online (Sandbox Code Playgroud)


Tod*_*ier 6

尽管最大值为 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左右找到了一个甜蜜点。天啊。