Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server在单个insert语句中可以插入的最大行数_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

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

SQL Server在单个insert语句中可以插入的最大行数,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我想做一个批量插入,类似于这个问题 SQL Server对单个insert语句中可以插入多少行的限制是什么 例如,当插入第一个值但第二个值导致主键冲突时会发生什么情况。所有INSERT语句是否回滚 使用insert-INTO。。。值…即 INSERT INTO TableName( Colum1) VALUES (1), (2), (3),...... upto 1000 rows. 但如果您使用SELECT语句在表中插入行,则没有限制,例如 INSERT IN

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

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

  • 例如,当插入第一个值但第二个值导致主键冲突时会发生什么情况。所有
    INSERT
    语句是否回滚


  • 使用
    insert-INTO。。。值…

    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)
    

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

    尽管最大值为1000,但已经证明,性能开始以更小的数字下降。尤金·菲利波夫(Eugene Philipov)写了一篇伟大的文章,探讨了这个主题:


    总而言之,作者做了一些精心设计的实验,并在25左右找到了一个最佳点。YMMV.

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

    ;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
    
    你可以试试这个

    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
    

    在查询时删除“---”有一个简短的解决方法,可以避免行限制,并且仍然将其视为一条语句(全部进入,或者如果有一个错误,则全部回滚)


    如果您必须询问,那么您可能应该使用批量插入。我想你的问题的答案可以通过谷歌搜索找到。是的,我想到了,但是由于系统中的某些限制,批量插入不是一个有效的选项
    插入值
    限制为1000,但是可以用,至于SQL world中的第二个问题,绝大多数语句都是要么全有要么全无。如果您在回答中包含一个指向文档的链接,其中每个
    插入1000行的限制是很好的。。值
    被写入:…错误消息是:“INSERT语句中的行值表达式数超过了允许的最大1000行值数。”请看我下面的答案,看看如何轻松添加1000多行。有什么方法可以超过1000行的限制并使其达到100000行?非常有趣。谢谢你的链接。
    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
    
    INSERT INTO tbl_name (a,b) 
    SELECT 1,2 UNION ALL
    SELECT 1,3 UNION ALL
    SELECT 1,4 .......