0

このSQLクエリを、反復ごとに1000アイテムずつSelect-Insert記録できるループバージョンに変更したいとします。

各反復で、最後に挿入されたアイテムが何であるかを確認するために印刷を取得する必要があります。

コード :

INSERT INTO [tData2]
(
    [Key], 
    Info1,
    Info2
)
SELECT 
    [Key], --the Id
    Info1,
    Info2
FROM
    [tData]

編集 :

(挿入を制限する他の条件がありましたが、質問とは関係ありません)

Bulk-Insertionロジックは変更されず、挿入するデータベース部分を縮小するだけです。テーブル全体を挿入する代わりに、反復ごとに10000アイテムを一括挿入し、それに関する簡単なレポートを取得することもできます。

あなたの助けは本当にありがたいです。

4

1 に答える 1

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
于 2012-07-19T07:53:50.030 に答える