Sql表拆分为批处理
在正向示例n=2中,我想将一个表拆分为n行的批次。我想这样做,以便可以将批导出到文件中。 我找到的解决方案如下: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
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:是的,我编辑了它,以防它不明显。