SQL Server Maximum rows that can be inserted in a single insert statment

前端 未结 5 436
悲哀的现实
悲哀的现实 2020-12-03 21:04

I want to do a batch insert, similar to this question

How to do a batch insert in MySQL

  1. What is the limitation is SQL Server on how many rows can b

相关标签:
5条回答
  • 2020-12-03 21:20

    Although the max is 1000, it's been demonstrated that performance begins to diminish at much smaller numbers. Eugene Philipov wrote a great article exploring this very topic:

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

    To summarize, the author did some very well-designed experimenting and found a sweet spot at around 25. YMMV.

    0 讨论(0)
  • 2020-12-03 21:21

    The Maximum number of rows you can insert in one statement is 1000 when using INSERT INTO ... VALUES... i.e.

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

    But if your are using a SELECT statement to insert rows in a table, there is no limit for that, something like...

    INSERT INTO TableName (ColName)
    Select Col FROM AnotherTable
    

    Now coming to your second question. What happens when an error occurs during an insert.

    Well if you are inserting rows using multi-value construct

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

    In the above scenario if any row insert causes an error the whole statement will be rolled back and none of the rows will be inserted.

    But if you were inserting rows with a separate statement for each row i.e. ...

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

    In the above case each row insert is a separate statement and if any row insert caused an error only that specific insert statement will be rolled back the rest will be successfully inserted.

    0 讨论(0)
  • 2020-12-03 21:23

    you can try this

    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
    

    Remove '--' at the time of query

    0 讨论(0)
  • 2020-12-03 21:28

    You can actually pass in an unlimited number of records using a subquery.

    ;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
    
    0 讨论(0)
  • 2020-12-03 21:35

    There's short workaround to avoid rows limit and still treat it like one statement (all goes in or if there's one error, everything is rolled back)

    INSERT INTO tbl_name (a,b) 
    SELECT 1,2 UNION ALL
    SELECT 1,3 UNION ALL
    SELECT 1,4 .......
    
    0 讨论(0)
提交回复
热议问题