检索SQL Server查询中的特定行数

时间:2015-02-12 11:38:04

标签: c# sql sql-server-2008 ssis

行:

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

我正在尝试从ssis包中获取export xml数据文件。

一个例子:我需要为每个文件创建2行。如果SSIS循环容器中的查询,sql命令可以确保每次返回正确的2行。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果您使用的是SQL Server 2012或更高版本,则可以在T-SQL

中使用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的更多详细信息

我希望它有所帮助

答案 2 :(得分:0)

我建议您先准备结果集,识别对(两行),然后迭代此结果集并从变量创建XML输出。我不知道您要准备的XML的复杂性,但至少下面的查询可以帮助您准备对识别器,如果您需要获取更复杂的数据,可以使用这些识别器。

根据您的数据:

0)准备变量:data - object,id int,name varchar(20)

1)将结果集作为对象返回 - 下面的查询准备具有相同id的对(row_group列)

2)在此对象上使用Foreach Ado net枚举器进行迭代,将数据插入变量

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

答案 3 :(得分:-1)

使用LIMIT从查询中获取正确的记录子集:

SELECT * FROM Orders LIMIT 10, 2

将从记录11开始从订单中检索两条记录