Sql 我以为是在跟踪整个可能的结果集——但也许不是。好吧,现在是ee。。。这更有意义。我会在一秒钟内编辑,表2中总会有记录,所以它永远不会结束,除非你跟踪你已经在这个表中访问了哪些行,不是吗?很高兴我不是唯一一个这样看的人,没有更多的无限循环——但一旦第一个25

Sql 我以为是在跟踪整个可能的结果集——但也许不是。好吧,现在是ee。。。这更有意义。我会在一秒钟内编辑,表2中总会有记录,所以它永远不会结束,除非你跟踪你已经在这个表中访问了哪些行,不是吗?很高兴我不是唯一一个这样看的人,没有更多的无限循环——但一旦第一个25,sql,sql-server,chunking,Sql,Sql Server,Chunking,我以为是在跟踪整个可能的结果集——但也许不是。好吧,现在是ee。。。这更有意义。我会在一秒钟内编辑,表2中总会有记录,所以它永远不会结束,除非你跟踪你已经在这个表中访问了哪些行,不是吗?很高兴我不是唯一一个这样看的人,没有更多的无限循环——但一旦第一个250000被写入,那将是所有被写入的内容。我想@rowcount不是我想的那样。看起来我需要t2的行数并从中递减,直到每个块都完成为止。@plditallo您测试过我下面的语法了吗?在我的示例中,它可以像您预期的那样一次分块两行。。。它将保持不变


我以为是在跟踪整个可能的结果集——但也许不是。好吧,现在是ee。。。这更有意义。我会在一秒钟内编辑,表2中总会有记录,所以它永远不会结束,除非你跟踪你已经在这个表中访问了哪些行,不是吗?很高兴我不是唯一一个这样看的人,没有更多的无限循环——但一旦第一个250000被写入,那将是所有被写入的内容。我想@rowcount不是我想的那样。看起来我需要t2的行数并从中递减,直到每个块都完成为止。@plditallo您测试过我下面的语法了吗?在我的示例中,它可以像您预期的那样一次分块两行。。。它将保持不变,直到它完成,除了最终选择可能小于原始块size@plditallo哦,你说得对。这是因为事务设置。更新了我的答案。提交事务时,rowcount值丢失。很高兴我不是唯一一个这样认为的人,没有更多的无限循环——但一旦第一个250000被写入,就可以写入了。我想@rowcount不是我想的那样。看起来我需要t2的行数并从中递减,直到每个块都完成为止。@plditallo您测试过我下面的语法了吗?在我的示例中,它可以像您预期的那样一次分块两行。。。它将保持不变,直到它完成,除了最终选择可能小于原始块size@plditallo哦,你说得对。这是因为事务设置。更新了我的答案。提交事务时,rowcount值丢失。
 DECLARE @ChunkSize int = 250000;

 WHILE @ChunkSize <> 0
 BEGIN
    BEGIN TRANSACTION

     INSERT TableName
      (col1,col2)
     SELECT TOP (@ChunkSize)
      col1,col2
     FROM TableName2

    COMMIT TRANSACTION;

    SET @ChunkSize = @@ROWCOUNT

   END -- transaction block

 END -- while-loop block
if object_id('tempdb..#source') is not null drop table #source
if object_id('tempdb..#destination') is not null drop table #destination

create table #source(c1 int, c2 int)
create table #destination (c1 int, c2 int)

insert into #source (c1,c2) values
(1,1),
(2,1),
(3,1),
(4,1),
(5,1),
(6,1),
(7,1),
(8,1),
(9,1),
(10,1),
(11,1),
(12,1)


 DECLARE @ChunkSize int = 2;

 WHILE @ChunkSize <> 0
 BEGIN

        INSERT INTO #destination (c1,c2)
        SELECT TOP (@ChunkSize) c1,c2 FROM #source WHERE c1 NOT IN (SELECT DISTINCT c1 FROM #destination) ORDER BY ROW_NUMBER() OVER (ORDER BY C1)
        SET @ChunkSize = @@ROWCOUNT

    --SELECT @ChunkSize
 END 

 select * from #source
 select * from #destination
DECLARE @ChunkSize int = 250000;

WHILE @ChunkSize > 0
BEGIN
  BEGIN TRANSACTION

   INSERT INTO TableName
    (col1,col2)
   SELECT TOP (@ChunkSize)
    col1,col2
   FROM TableName2 T2
   WHERE NOT EXISTS (SELECT *
                     FROM   TableName T
                     WHERE  T.Col1 = T2.Col1
                     AND    T.Col2 = T2.Col2)

  SET @ChunkSize = @@ROWCOUNT
  PRINT CONVERT(nvarchar(10),@ChunkSize) + ' Rows Inserted.';

  COMMIT TRANSACTION

END -- while-loop block