Sql表拆分为批处理

Sql表拆分为批处理,sql,sql-server-2005,sql-server-2008,tsql,Sql,Sql Server 2005,Sql Server 2008,Tsql,在正向示例n=2中,我想将一个表拆分为n行的批次。我想这样做,以便可以将批导出到文件中。 我找到的解决方案如下: 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','I

在正向示例n=2中,我想将一个表拆分为n行的批次。我想这样做,以便可以将批导出到文件中。 我找到的解决方案如下:

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

任何人都可以建议一种解决方案,不包括将数据复制到临时表中,也不以任何方式更改源表。我也希望这适用于任何表,也就是说,我不能推测源具有用于排序的标识选项卡ID或日期键。

您不需要具有唯一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批的行。一个简单的循环,增加批次号,一次可以得到一个批次;当不再存在批时,停止循环


唯一的问题是,在处理过程中,如果表中的行数发生变化。

您计划如何导出一批行?每批行都要导出到单独的文件中…是的,您说过。您没有指定计划使用的机制,因此我在回答时无法考虑这一点。使用此方法时,您唯一需要注意的是,提供排序的数据在提取过程中不能更改。但是,如果这是一个问题,那么你需要使用一个不可变的单调值,比如一个标识或插入日期来纠正它。@Stuart:是的,我编辑了它,以防它不明显。