我想将一个表拆分成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进行排序。
答案 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的行。围绕此行的简单循环会增加批次编号,一次可以获得一批;当不再存在批次时停止循环。
唯一的问题是,当您处理时,表格中的行数会发生变化。