set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
/*
2006/5/6 by LiuYong
功能:
执行SQL语句查询分页的公共存储过程。
参数:
@pSQL varchar(8000) SQL语句
@pIDCol varchar(50) ID列名
@pCurPage int = 1 当前页
@pPageSize int = 20 页大小
返回:
返回所有子类的ID串,多个ID用逗号分隔
*/
ALTER PROCEDURE [Storage].[sp_CommQueryProc]
(
@pSQL varchar(8000), --SQL语句
@pIDCol varchar(500), --ID列名
@pOrder varchar(500)='', --排序字串
@pCurPage int = 1,   --当前页
@pPageSize int = 15, --页大小
@pRecNums int output, --记录数
@pRecPages int output --记录页数

) AS
BEGIN
SET NOCOUNT ON
BEGIN TRAN
declare @strSQL varchar(5000)
declare @strSubSQL varchar(5000)
declare @RecStart int
declare @RecEnd  int
declare @MaxCount int
declare @Pages int
set @MaxCount = 0
set @Pages = 0
--插入当前页及以前的数据的ID值到临时表
create table #tmpTable(
[ID] numeric identity(1,1) not null,
[DataID] numeric not null
)
--set @strSubSQL = 'SELECT top ' + convert(varchar(100),@PageEnd) + ' ' + @pIDCol
set @strSubSQL = 'SELECT ' + @pIDCol
 + '  FROM (' + @pSQL + ') '
set @strSQL = 'INSERT INTO #tmpTable([DataID]) ' + @strSubSQL + ' as st '
if(@pOrder != '')
set @strSQL = @strSQL + ' order by ' + @pOrder
exec(@strSQL)
set @MaxCount = @@rowcount
if @@ERROR != 0 goto Err_Proc
set @Pages = @MaxCount/@pPageSize
if(@MaxCount % @pPageSize > 0)
set @Pages = @Pages + 1
if(@pCurPage<=0)
set @pCurPage = 1
if(@pCurPage > @Pages)
set @pCurPage = @Pages --传入的当前页号大于总页数的情况的意外处理
set @RecStart = (@pCurPage-1) * @pPageSize + 1 --设置显示其实区域
set @RecEnd = @pCurPage * @pPageSize --设置显示终止区域
set @pRecNums = @MaxCount --记录数
set @pRecPages = @Pages --记录页数
--把临时表中的数据与子集中的数据匹配
set @strSQL = 'SELECT st.* FROM (' + @pSQL + ') as st,#tmpTable tt 
WHERE tt.[ID] >=' + convert(varchar(100),@RecStart) + ' 
AND tt.[ID] <= ' + convert(varchar(100),@RecEnd) + ' 
AND tt.[DataID] = st.' + @pIDCol
exec(@strSQL)
if @@ERROR != 0 goto Err_Proc
OK_Proc:
commit tran
drop table #tmpTable
set nocount off
return 0
Err_Proc:
rollback tran
print @strSQL
drop table #tmpTable
set nocount off
return -1
END