Стол Sql разделен на партии - PullRequest
0 голосов
/ 09 ноября 2011

Я хочу разбить таблицу на пакеты по 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

Может кто-нибудь предложить решение, которое не включает копирование данных в временную таблицу и НЕ ИЗМЕНЯЯ исходную таблицу в любом путь. И я также хочу, чтобы это работало для любой таблицы, т. Е. Я не могу предположить, что в источнике есть идентификатор табуляции или дата_ключа для сортировки.

1 Ответ

2 голосов
/ 09 ноября 2011

Вам не нужно иметь уникальный идентификатор, если вы знаете хотя бы одно имя столбца, по которому вы можете заказать.

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. Простой цикл вокруг этого, который увеличивает номер партии, будет получать по одной партии за раз; просто перестаньте зацикливаться, когда больше нет партий.

Единственная проблема заключается в том, что количество строк в вашей таблице изменяется во время обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...