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

时间:2016-05-26 22:05:55

标签: sql sql-server sql-server-2012

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

How to do a batch insert in MySQL

  1. SQL Server对单个插入语句中可以插入多少行的限制是什么?

  2. 例如,插入第一个值但第二个值导致主键违规时会发生什么。所有INSERT语句是否已回滚?

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

5 个答案:

答案 0 :(得分:18)

使用INSERT INTO ... VALUES...

时,可以在一个语句中插入的最大行数为1000
INSERT INTO TableName( Colum1)
VALUES (1),
       (2),
       (3),...... upto 1000 rows. 

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

INSERT INTO TableName (ColName)
Select Col FROM AnotherTable

现在回答你的第二个问题。插入过程中发生错误时会发生什么。

好吧,如果您使用多值构造

插入行
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)

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

答案 1 :(得分:2)

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

;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

答案 2 :(得分:1)

尽管最大值为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。

答案 3 :(得分:0)

您可以尝试

with tempDataTable AS (SELECT *From (VALUES
(18001,79626,'1992-12-11','1993-12-11') -- this is data u want to insert
)x(empNO,sal,frmDate,toDate)) -- tempDataColoumns
INSERT INTO salaries(emp_no,salary,from_date,to_date) SELECT empNO,sal,frmDate,toDate from newData

在查询时删除“-”

答案 4 :(得分:0)

有一个简短的解决方法,可以避免行数限制,并且仍然将其视为一条语句(全部输入,或者如果出现一个错误,则所有内容都会回滚)

INSERT INTO tbl_name (a,b) 
SELECT 1,2 UNION ALL
SELECT 1,3 UNION ALL
SELECT 1,4 .......