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