改写了下通用存储过程分页,支持多表关联查询与排序.
/****************************************************
**获取分页数据的通用存储过程,支持多表关联查询
**作者:蔡鸟非菜
**根据sql语句:
**select table1.*,table2.* into #tblTemp from table1,table2 where .. order by id
**select top 10 * from #tblTemp where id >= (select max(id) from (select top ((页码-1)*页大小) id from #tblTemp)
**Function dbo.TrimColumn(@orderName) 去除字段的前缀 例如 @str = dbo.TrimColumn('A.ID') 则@str为'ID'
*****************************************************/
Create PROCEDURE GetDataPage
(
@tblName varchar(255), --表名 例如:set @tblName = 'table1 A,table2 B'
@strGetFields varchar(1000), --要显示的列的名称 例如:set @strGetFields = 'A.ID,A.条码,B.仓库名称'
@orderName varchar(255), --用来排序的字段名称 例如:set @orderName = 'A.ID'
@orderType bit, --设置排序类型,升序0,其他降序 例如:set @orderType = '0'
@pageSize int, --页显示的数据条数 例如:set @pageSize = '10'
@pageIndex int, -- 页码 例如:set @pageIndex = '1'
@doCount bit, --返回记录总数,非则返回
@strWhere varchar(1500) --查询条件 例如:set @strWhere = 'and A.仓库ID = B.ID'
)
AS
declare @strSQL varchar(8000) -- 存放主SQL语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @DoCount != 0 --需要返回记录总数时
begin
if @strWhere != ''
set @strSQL = 'select count(*) as Total from ' + @tblName + ' where 1 = 1 ' + @strWhere
else
set @strSQL = 'select count(*) as Total from ' + @tblName + ''
end
else --不需要返回记录总数时
begin
if @orderType != '0'
begin
set @strTmp = '<= (select min'
set @strOrder = ' order by ' + @orderName +' desc'
end
else
begin
set @strTmp = '>= (select max'
set @strOrder = ' order by ' + @orderName +' asc'
end
-- 查询的如果是第一页时
if @pageIndex = 1
begin
if @strWhere != ''
set @strSQL = 'select top '+ str(@PageSize) + ' ' + @strGetFields + ' from ' + @tblName + ' where 1 = 1 ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top '+ str(@PageSize) + ' ' + @strGetFields + ' from ' + @tblName + ' '+ @strOrder
end
else --不是第一页时
begin
if @orderType != '0'
begin
set @strOrder = ' order by ' + dbo.TrimColumn(@orderName) +' desc'
end
else
begin
set @strOrder = ' order by ' + dbo.TrimColumn(@orderName) +' asc'
end
set @strSQL = 'select ' + @strGetFields + ' into #tblTemp from ' + @tblName + ' where 1 = 1 ' + @strWhere + ' ' + @strOrder
+ ' select top ' + str(@PageSize) + ' * from [#tblTemp] '
+ ' where [' + dbo.TrimColumn(@orderName) + '] ' + @strTmp + '(['+ dbo.TrimColumn(@orderName) + ']) from (select top '
+ str((@PageIndex-1)*@PageSize) + ' [' + dbo.TrimColumn(@orderName) + '] from [#tblTemp]) as tblTmp) ' + @strOrder
+ ' drop table #tblTemp '
end
end
exec(@strSQL)
RETURN
高效通用分页存储过程(支持多表关联)
最新推荐文章于 2019-07-29 17:35:55 发布