将一个大的插入查询分解成更小的查询

Dus*_*ust 7 sql-server t-sql

我有以下INSERT查询。它尝试插入超过 50,000 行,但由于日志记录而失败。是否有一种很好的方法可以将这样的查询拆分为大约 1000 个左右的COMMIT语句批次,使其不仅仅是一个大语句?

INSERT INTO xxx (....) SELECT .... FROM xx
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 9

DECLARE @rc INT = 1;
WHILE @rc > 0
BEGIN
  BEGIN TRANSACTION;

  INSERT dbo.target(cols) 
    SELECT TOP (5000) cols 
    FROM dbo.source AS s
    WHERE NOT EXISTS 
    (
      SELECT 1 FROM dbo.target AS t
      WHERE t.key = s.key
    )
    ORDER BY clustering_key;

  SET @rc = @@ROWCOUNT;
  COMMIT TRANSACTION;
END
Run Code Online (Sandbox Code Playgroud)

另见: