想要将这段SQL查询更改为循环版本
每次迭代Select-Insert
可以记录 1000项。
在每次迭代时,想要获得打印以查看最后插入的项目是什么。
守则:
INSERT INTO [tData2]
(
[Key],
Info1,
Info2
)
SELECT
[Key], --the Id
Info1,
Info2
FROM
[tData]
修改:
(还有其他限制插入的条件,与问题无关)
不会更改批量插入逻辑,只需缩小要插入的数据库片段即可。 我们不是插入整个表,而是每次迭代批量插入10000个项目,并且也可以获得一个简单的报告。
非常感谢您的帮助。
答案 0 :(得分:2)
以下是我快速整理的一些示例代码,供您进行实验。这不使用游标(而是使用while),但你也可以这样构建它。您可以进行一些性能优化,但只有您可以判断。 YMMV
set nocount on
/* mock up source/dest tables */
declare @src table (id int, value varchar(max));
declare @dest table (id int, value varchar(max));
/* fill source with some data */
declare @rownum int;
set @rownum=0;
while (@rownum<5000) begin
insert into @src select @rownum,'test value ' + CONVERT(varchar(25),@rownum);
select @rownum=@rownum+1;
end
/* laod batched data */
declare @pagesize int;set @pagesize=1000;
declare @rowlow int;set @rowlow=0;
declare @rowmax int;set @rowmax=@pagesize;
declare @ct int;select @ct = COUNT(*) from @src;
declare @id int;
declare @value varchar(max);
while (@rowmax<=@ct) begin
WITH result_set AS (
SELECT ROW_NUMBER() OVER (ORDER BY id) AS [row_number], id,value
FROM @src
) insert into @dest
SELECT id,value FROM result_set
WHERE [row_number] BETWEEN @rowlow AND @rowmax
-- Output
print 'Copied rows ' + convert(varchar(25),@rowlow) + ' to ' + convert(varchar(25),@rowmax)
-- Increment batch counters
select @rowlow=@rowmax+1,@rowmax+=@pagesize;
end
select * from @dest