我试图将数百万记录从另一个表(在同一Microsoft SQL Server中)插入Microsoft SQL Server表中,并使用row_number()
函数进行批处理计算,如下所示。
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
查询。
如果要插入一些行,提交,然后开始插入另一个,则需要分批进行。我们几乎没有信息要浏览,因此这是一个非常简单的pseudo-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;