Sql表拆分成批

时间:2011-11-09 13:06:59

标签: sql sql-server-2005 sql-server-2008 tsql

我想将一个表拆分成n行(在前面的例子中n = 2)。我想这样做,以便我可以将批次导出到文件中。 我找到的解决方案如下:

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进行排序。

1 个答案:

答案 0 :(得分: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的行。围绕此行的简单循环会增加批次编号,一次可以获得一批;当不再存在批次时停止循环。

唯一的问题是,当您处理时,表格中的行数会发生变化。