对sql for xml的查询结果作分页处理思路
2014-03-27 16:09
253 查看
背景: 在批量处理大量数据时,可能最终生成的xml文件中包含多条记录,客户希望作分页处理,让系统每次运行时自动生成多个xml文件。
提示:这里只是演示效果, 已把真实的逻辑部分简化成单表,单一xml格式了。但我们在复杂情况下可以参考其做法。
效果图:
sql 代码:(运行环境:sql 08 R2, sql 2012)
-- sample
-- select * from
--(
-- select *,ROW_NUMBER() over(order by [provider_id]) AS RowNum
-- from [Provider]
--) t where t.RowNum>=1 and t.RowNum<=10
use casenet
declare @external_id varchar(8)='0076283' -- here to be configured
declare @PageSize int=5 -- here to be configured
declare @PageIndex int=1 -- start from 1, will be auto changed in dynamic running
declare @PageCount int -- will be set value in dynamic running
declare @RecordCount int -- will be set value in dynamic running
declare @xml xml
declare @schemaVersion varchar(10)='5.1'
select @RecordCount=max(RowNum)
from
(
select PROVIDER_ID,ROW_NUMBER() over(order by [provider_id]) AS RowNum
from [Provider] p
inner join integration.dbo.entity_mappings m1
on p.provider_id= m1.internal_id and m1.type='Provider'
--where p.external_id like '0189026A%'
--or p.external_id like '0151722A%'
where p.external_id like ''+ @external_id+ '%'
) a
select @PageCount=@RecordCount / @PageSize + convert(int,convert(bit, @RecordCount % @PageSize ))
select @RecordCount as RecordCount,@PageSize as PageSize,@PageCount as [PageCount]
-- sample
--while(@PageIndex<=@PageCount)
--begin
-- select @PageIndex
-- select @PageIndex=@PageIndex+1
--end
while(@PageIndex<=@PageCount)
begin
set @xml=(
select provider_id as provider_id
,obsolete as obsolete
,npi as npi
from [Provider]
WHERE provider_id IN
(
SELECT provider_id
FROM
(
select PROVIDER_ID,RowNum from
(
select PROVIDER_ID,ROW_NUMBER() over(order by [provider_id]) AS RowNum
from [Provider]
) t where
--t.RowNum>=1 and t.RowNum<=10
t.RowNum>= ( @PageSize * (@PageIndex-1) +1 )
and t.RowNum<=( @PageSize * @PageIndex )
) A
)
FOR XML PATH('provider'),ROOT('providers'),ELEMENTS XSINIL
)
set @xml.modify('insert attribute schemaVersion{sql:variable(''@schemaVersion'')} as last into (/providers)[1]') --add property:schemaVersion
select @xml
select @PageIndex=@PageIndex+1
end
提示:这里只是演示效果, 已把真实的逻辑部分简化成单表,单一xml格式了。但我们在复杂情况下可以参考其做法。
效果图:
sql 代码:(运行环境:sql 08 R2, sql 2012)
-- sample
-- select * from
--(
-- select *,ROW_NUMBER() over(order by [provider_id]) AS RowNum
-- from [Provider]
--) t where t.RowNum>=1 and t.RowNum<=10
use casenet
declare @external_id varchar(8)='0076283' -- here to be configured
declare @PageSize int=5 -- here to be configured
declare @PageIndex int=1 -- start from 1, will be auto changed in dynamic running
declare @PageCount int -- will be set value in dynamic running
declare @RecordCount int -- will be set value in dynamic running
declare @xml xml
declare @schemaVersion varchar(10)='5.1'
select @RecordCount=max(RowNum)
from
(
select PROVIDER_ID,ROW_NUMBER() over(order by [provider_id]) AS RowNum
from [Provider] p
inner join integration.dbo.entity_mappings m1
on p.provider_id= m1.internal_id and m1.type='Provider'
--where p.external_id like '0189026A%'
--or p.external_id like '0151722A%'
where p.external_id like ''+ @external_id+ '%'
) a
select @PageCount=@RecordCount / @PageSize + convert(int,convert(bit, @RecordCount % @PageSize ))
select @RecordCount as RecordCount,@PageSize as PageSize,@PageCount as [PageCount]
-- sample
--while(@PageIndex<=@PageCount)
--begin
-- select @PageIndex
-- select @PageIndex=@PageIndex+1
--end
while(@PageIndex<=@PageCount)
begin
set @xml=(
select provider_id as provider_id
,obsolete as obsolete
,npi as npi
from [Provider]
WHERE provider_id IN
(
SELECT provider_id
FROM
(
select PROVIDER_ID,RowNum from
(
select PROVIDER_ID,ROW_NUMBER() over(order by [provider_id]) AS RowNum
from [Provider]
) t where
--t.RowNum>=1 and t.RowNum<=10
t.RowNum>= ( @PageSize * (@PageIndex-1) +1 )
and t.RowNum<=( @PageSize * @PageIndex )
) A
)
FOR XML PATH('provider'),ROOT('providers'),ELEMENTS XSINIL
)
set @xml.modify('insert attribute schemaVersion{sql:variable(''@schemaVersion'')} as last into (/providers)[1]') --add property:schemaVersion
select @xml
select @PageIndex=@PageIndex+1
end
相关文章推荐
- PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
- (转)PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
- 【转】PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
- PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
- SQL SERVER中 用FOR XML PATH将查询结果以XML输出 然后应用于 sql 合并字段功能介绍
- SQL 字段charindex,stuff,ltrim, for xml path('') 操作字符串 合并查询结果项值
- SQL Server 中的XML支持,查询返回XML,Web访问SQL取XML形式结果
- SQL 查询结果为 XML
- 如何在Sql Server上使用一条SQL查询结果总数并且分页
- 查询 SQL_Server 所有表的记录数: for xml path
- 麻烦问一下单字段按查询结果精度返回结果,思路怎么做(除sql 的union合并)
- SQL查询-将列转换成字符串(for xml path)
- 通过sql语句查询出来的结果字段没有到对应实体类时的处理方法
- 【转】灵活运用 SQL SERVER FOR XML PATH。用于方便处理生成视图
- 相同的sql 分页查询结果
- 查询结果分页显示的sql语句
- SQL查询的分页思路
- 使用FOR XML将查询结果以XML格式返回(Using the FOR XML Clause to Return Query Results as XML)
- sql查询结果转XML和JSON
- sqlserver 用 STUFF 和 for xml path 把查询结果连接成字符串