2015-02-12 4 views
0

строк SQL Server:Получить определенное количество строк в запросе

1 Test1 
2 Test2 
3 Test3 
12 Test4 
5 Test1 
6 Test2 
7 Test1 
8 Test2 

Я пытаюсь добиться экспорта XML файл данных из пакета SSIS.

Пример: Мне нужно создать 2 строки на файл. Какая команда sql может обеспечить возврат правильных 2 строк за раз, если этот запрос в контейнере цикла SSIS.

ответ

0

Я предлагаю вам подготовить ResultSet прежде, определить пары (две строки), а затем повторять этот результирующий и создал вывод XML из переменная. Я не знаю сложность XML, которую вы хотите подготовить, но, по крайней мере, запрос, который вы можете найти ниже, может помочь вам подготовить пары идентификаторов, которые могут быть использованы, если вам нужно получить более сложные данные.

на основе ваших данных:

0) подготовить переменные: данные - объект, ID INT, имя VARCHAR (20)

1) возвращает свой результирующий как объект - запрос ниже подготовить пары с одинаковым идентификатором (row_group колонок)

2) итерация с Foreach Ado чистого перечислителем над этим объектом, вставить данные в переменные

3) внутри Foreach подготовки задачи потока данных с динамическим именем файла на основе row_group

with 
data 
as 
(
select *, row_number() over(order by id) as row 
from test_data 
) 
, 
pairs 
as 
(
select * , 
case when row%2=0 then row-1 else row end as row_group 
from data 
) 

select id, name, row_group 
from pairs 
order by row_group 
-1

использовать LIMIT, чтобы получить правильное подмножество записей из запроса:

SELECT * FROM Orders LIMIT 10, 2 

будет retrive две записи из заказов, начиная с записи 11

+0

Я думаю, что ограничение не работает на сервере sql server – Tun

+0

, вы правы, TOP сделает то же самое. Я неправильно читал mysql как db. Только проблема заключается в том, что вам нужно дважды запустить его, чтобы выбрать диапазон: сначала выберите верхнюю 12, а затем верхнюю часть 2 этого подмножества. –

+0

спасибо за ответ. но я не уверен, что это правильно. – Tun

0

Если вы используете SQL Server 2012 или более поздней версии, вы можете использовать усиление SQL подкачки в T-SQL

Пожалуйста, проверьте ниже запрос, чтобы увидеть, если это помогает Обратите внимание, что @N параметр следует рассматривать как число петель

/* 
create table tbl (id smallint, txt varchar(25)) 
insert into tbl select 1, 'Test1' 
insert into tbl select 2, 'Test2' 
insert into tbl select 3, 'Test3' 
insert into tbl select 12, 'Test4' 
insert into tbl select 5, 'Test1' 
insert into tbl select 6, 'Test2' 
insert into tbl select 7, 'Test1' 
insert into tbl select 8, 'Test2' 
insert into tbl select 9, 'Test1' 
delete tbl where id = 9 
*/ 

declare @rowsperpage int = 2 
declare @x int = @rowsperpage 
declare @n int = 1 

while @x = @rowsperpage 
begin 

SELECT * 
FROM tbl 
ORDER BY id 
OFFSET (@n-1)*@rowsperpage ROWS 
FETCH NEXT @rowsperpage ROWS ONLY 

select @x = @@ROWCOUNT 
set @n = @n + 1 

end 

Вы можете найти более подробную информацию о SQL paging using offset and fetch next в упомянутой обучающей

Я надеюсь, что это помогает

+0

Я получаю сообщение об ошибке: Msg 102, Level 15, State 1, Line 11 Неправильный синтаксис около 'OFFSET'. Msg 153, уровень 15, состояние 2, строка 12 Недопустимое использование опции NEXT в инструкции FETCH. – Tun

+0

Какую версию SQL Server вы используете? Этот код будет работать для SQL2012 и позже, как я писал в исходном сообщении – Eralper

1

Попробуйте это.

Create table Temp (id smallint, Col1 varchar(25)) 
insert into Temp select 1, 'Test1' 
insert into Temp select 2, 'Test2' 
insert into Temp select 3, 'Test3' 
insert into Temp select 12, 'Test4' 
insert into Temp select 5, 'Test1' 
insert into Temp select 6, 'Test2' 
insert into Temp select 7, 'Test1' 
insert into Temp select 8, 'Test2' 
insert into Temp select 10, 'Test1' 


declare @i int = (select Max(RowNum) from (select ROW_NUMBER() over(order by id) as RowNum,id,Col1 from Temp) as temp) 

declare @countnum int = 1 
declare @NoOfRows int = 100 

while(@countnum <= @i) 
begin 

select * from (select ROW_NUMBER() over(order by (select 0)) as RowNum,id,Col1 from Temp) as temp where RowNum >= @countnum and RowNum < @countnum + @NoOfRows 

set @countnum = @countnum + @NoOfRows 
end 

drop table Temp 
+0

, это кажется правильным. Если я хочу 100 за выбор. изменить 2 на 100? – Tun

+0

Да, вы можете сделать это за то, что вам нужно изменить состояние.Я обновляю свой ответ, чтобы полностью удовлетворить ваши требования. – Juhi

+0

@Coder: Выполняет ли это ваше требование? – Juhi

Смежные вопросы