Microsoft SQL Server批处理存储过程中的间歇提交

时间:2019-02-26 11:01:16

标签: sql sql-server sql-server-2008 sql-server-2017

我正尝试使用row_number()函数通过如下所示的批号计算将数百万条记录从另一个表(在同一Microsoft SQL Server中)插入另一个表的Microsoft SQL Server表中。

CEILING((ROW_NUMBER() OVER (ORDER BY ITEM,LOC))/CONVERT(FLOAT,'''
                       +CONVERT(VARCHAR(55),@PLANNING_BATCH_SIZE)+'''))-1+convert(float,'''+convert(varchar(55),@PREVIOUSEBATCHSIZE)+''' ) AS BATCH_NUM

将所有这些记录插入具有批号的表中之后,我将调用Java方法来通过使用每个批处理数据来启动另一个进程。

现在要插入数百万条记录需要花费几分钟的时间,Java方法必须等到整个插入完成为止。我的问题是,SQL Server中是否有任何选项可以应用间歇性提交? INSERT INTO SELECT个查询。

1 个答案:

答案 0 :(得分:0)

如果要插入一些行,请提交,然后开始插入另一行,则需要分批执行。我们此处的信息很少,因此这是一个非常个简单的伪SQL示例,说明了可能小批量插入数据的方式:

BEGIN TRANSACTION;

INSERT INTO YourDestinationTable ({COLUMNS})
SELECT TOP 1000
       {COLUMNS}
FROM YourSourceTable ST
WHERE NOT EXISTS (SELECT 1
                  FROM YourDestinationTable YD
                  WHERE YD.{IDENTITY COLUMN} = ST.{IDENTITY COLUMN});

COMMIT;

WHILE @@ROWCOUNT > 0 BEGIN

    BEGIN TRANSACTION;

    INSERT INTO YourDestinationTable ({COLUMNS})
    SELECT TOP 1000
           {COLUMNS}
    FROM YourSourceTable ST
    WHERE NOT EXISTS (SELECT 1
                      FROM YourDestinationTable YD
                      WHERE YD.{IDENTITY COLUMN} = ST.{IDENTITY COLUMN});

    COMMIT;

END;