2011-11-09 56 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 

任何人都可以提出一個解決方案,不包括數據複製到臨時表不改變以任何方式源表。而且我也希望這可以用於任何表格,即我無法推測源代碼具有用於排序的縮進tabid或date_key。

+0

你打算如何導出一批行? – Sorpigal

+0

每批行分成單獨的文件... –

+0

是的,所以你說。你沒有具體說明你計劃使用哪種機制,所以在回答時我不能考慮這個機制。 – Sorpigal

回答

2

只要您知道至少一個可以排序的列名稱,則不需要擁有唯一的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

用這種方法你必須小心的唯一的事情是,提取過程中提供排序的數據不能改變。但是,如果這是一個問題,那麼你需要求助於使用不可變的單調值(如身份或插入日期)來糾正它。 –

+0

@Stuart:是的,我編輯過這個以防萬一。 – Sorpigal

+0

這是一個很好的解決方案。我會馬上測試:D –