2011-11-09 13 views
0

テーブルをn行のバッチに分割したい(前方の例ではn = 2)。私はファイルにバッチをエクスポートできるようにこれを実行したいと思います。私が見つけた 解決策は以下の通りです:バッチに分割されたSQLテーブル

create table tbl_test (
first_name nvarchar(255), 
last_name nvarchar(255), 
[address] nvarchar(255), 
) 

Insert tbl_test values ('Andrei','Corovei','str Meteor') 
Insert tbl_test values ('Pop','Ionut','str Meteor') 
Insert tbl_test values ('Whitehead','John','str Lunii') 
Insert tbl_test values ('Grisham','Robert','str Corcoduselor') 
Insert tbl_test values ('Eugen','Johnesco','str Prunelor') 


select * into #tbl_temp from tbl_test 

alter table #tbl_temp add tabid int identity(1,1) 


declare @current int = 1 
while @current < ident_current('#tbl_temp') 
begin 
select * from #tbl_temp 
    where tabid between @current and @current +1 
set @current = @current + 2 
end 

drop table #tbl_temp 
drop table tbl_test 

誰でもとはどのような方法でソーステーブルを変更しない一時テーブルへのデータのコピーが含まれていない解決策を提案することができます。また、これはどのテーブルでも機能するようにしたい。つまり、ソートにindentity tabidまたはdate_keyがあると推測できない。

+0

行のバッチをどのようにエクスポートする予定ですか? – Sorpigal

+0

別々のファイルに行の各バッチ... –

+0

はい、あなたは言った。あなたは、あなたが使用しようとしているメカニズムを指定していないので、回答中にそれを考慮に入れることができませんでした。 – Sorpigal

答えて

2

注文できる列名が少なくとも1つわかっている限り、一意のIDを持つ必要はありません。

declare @tbl_test table(
    first_name nvarchar(255), 
    last_name nvarchar(255), 
    [address] nvarchar(255) 
); 

insert @tbl_test values ('Andrei','Corovei','str Meteor'); 
insert @tbl_test values ('Pop','Ionut','str Meteor'); 
insert @tbl_test values ('Whitehead','John','str Lunii'); 
insert @tbl_test values ('Grisham','Robert','str Corcoduselor'); 
insert @tbl_test values ('Eugen','Johnesco','str Prunelor'); 

select 
     * 
    from 
     (select 
       row_number() over (partition by r%2 order by first_name) as batch, 
       * 
      from 
       (select 
         row_number() over (order by first_name) as r, 
         * 
        from 
         @tbl_test 
       ) as t 
     ) as b 
    where 
     batch = 2 
    order by 
     batch, r 
; 

この結果は、バッチ番号をインクリメントし、この周りに単純なループはあなたに一度に一つのバッチを取得するバッチ2に行くだけの行を参照してくださいということです。より多くのバッチが存在しなくなったときにループを止めるだけです。

唯一の問題は、処理中にテーブル内の行数が変化した場合です。

+0

このメソッドに注意する必要があるのは、ソートを提供するデータを抽出中に変更できないことだけです。しかし、それが問題であれば、不変の単調な値(IDや挿入日など)を使用して値を修正する必要があります。 –

+0

@Stuart:はい、私はこれが明らかではない場合に注意するように編集しました。 – Sorpigal

+0

これは素晴らしい解決策です。私はすぐにそれをテストします:D –

関連する問題