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

3wabscal  于 2022-12-03  发布在  SQL Server
关注(0)|答案(7)|浏览(309)

我想进行批量插入,类似于以下问题
How to do a batch insert in MySQL

  1. SQL Server对在单个插入语句中可以插入多少行有什么限制?
    1.例如,当第一个值被插入,但第二个值导致主键冲突时,会发生什么情况?所有的INSERT语句都回滚了吗?
INSERT INTO tbl_name (a,b) 
VALUES (1, 2), (1, 3));
ndasle7k

ndasle7k1#

使用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)

在上述情况下,每个行插入都是一个单独的语句,如果任何行插入导致错误,则只有该特定插入语句将被回滚,其余语句将被成功插入。

omvjsjqw

omvjsjqw2#

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

;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
ajsxfq5m

ajsxfq5m3#

虽然最大值为1000,但事实证明,当数值更小时,性能就会开始下降。尤金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左右找到了一个最佳点。

yqlxgs2m

yqlxgs2m4#

你可以试试这个

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

在查询时删除'--'

qyyhg6bp

qyyhg6bp5#

有一个简短的解决方法,可以避免行数限制,并仍然将其视为一个语句(所有语句都进入,或者如果有一个错误,则所有语句都回滚)

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

frebpwbc6#

Dutchman的解决方案很酷,但可以简化,结果证明你不需要CTE,我试过了,它可以在没有CTE的情况下工作,如下所示:

INSERT INTO TableName (Column1, Column2) SELECT Id, SomeName
  FROM  ( VALUES  (1, 'A'),(2,'B'),(3,'C')) x (Id, SomeName)
wmvff8tz

wmvff8tz7#

这就是我如何将1000多个值添加到临时表中。

CREATE TABLE #TempTable(ID int)

INSERT INTO #TempTable (ID)
SELECT * from  (VALUES (45764),(45763),(45762),(45761),(45760),(45759),(45758),(45757),(45756)....)AS temp (column1)

相关问题