如何批量INSERT SQL Server?

Rya*_*don 8 sql sql-server insert

我正在尝试将行从一个表批量插入到另一个表。

DECLARE @batch INT = 10000;

WHILE @batch > 0
BEGIN
BEGIN TRANSACTION

    INSERT into table2
    select top (@batch) *
    FROM table1

    SET @batch = @@ROWCOUNT

COMMIT TRANSACTION

END
Run Code Online (Sandbox Code Playgroud)

它在前 10,000 个上运行并插入它们。然后我收到错误消息“无法插入重复的键”,它试图插入相同的主键,所以我假设它试图重复同一批次。我在这里缺少什么逻辑来循环批次?可能很简单,但我无法弄清楚。

有人可以帮忙吗?谢谢

das*_*ght 14

您的代码不断插入相同的行。您可以通过对插入内容进行“分页”来避免这种情况:

DECLARE @batch INT = 10000;
DECLARE @page INT = 0
DECLARE @lastCount INT = 1

WHILE @lastCount > 0
BEGIN
BEGIN TRANSACTION

    INSERT into table2
    SELECT col1, col2, ... -- list columns explicitly
    FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY YourPrimaryKey ) AS RowNum, *
              FROM      table1
            ) AS RowConstrainedResult
    WHERE   RowNum >= (@page * @batch) AND RowNum < ((@page+1) * @batch)
    SET @lastCount = @@ROWCOUNT
    SET @page = @page + 1

COMMIT TRANSACTION

END
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 6

您需要某种方法来消除现有的行。您似乎有一个主键,因此:

INSERT into table2
   SELECT TOP (@batch) *
   FROM table1 t1
   WHERE NOT EXISTS (SELECT 1 FROM table2 t2 WHERE t2.id = t1.id);
Run Code Online (Sandbox Code Playgroud)