28,391
社区成员
发帖
与我相关
我的任务
分享
if not object_id('Cdt_changePage') is null drop procedure Cdt_changePage
go
create procedure [dbo].[Cdt_changePage]
@pagesize int, --每页显示的数据数
@pageindex int, --当前页码
@tbName varchar(20), --表名
@columns varchar(600), --需要查询的字段
@keyIndex varchar(20), --自增字段名(自动编号)
@where varchar(200), --查询条件,不用写where
@order varchar(200) --排序,不用写order by
as
declare @strSQL varchar(3000)
--准备分页
declare @datacount int --总记录数
declare @pagecount int --总页数
if @order=''
begin
set @order=' '+@keyIndex+' desc'
end
--获取总记录数
if not object_id('#cdt_tem') is null drop table #cdt_tem
create table dbo.#cdt_tem(datacount int)
exec('insert #cdt_tem select count(*) as datacount from '+@tbName+' where 1=1 '+@where)
set @datacount=(select top 1 datacount from #cdt_tem)
if not object_id('#cdt_tem') is null drop table #cdt_tem
--计算总页数
if(@datacount%@pagesize)=0
begin
set @pagecount=(@datacount/@pagesize)
end
else
begin
set @pagecount=(@datacount/@pagesize)+1
end
--开始分页
if @pageindex<=1
begin
set @strSQL = 'select top '+str(@pagesize)+' '+str(@datacount)+' as datacount, '+str(@pagecount)+' as pagecount, '+@columns+'
from '+@tbName+' where 1=1 '+@where+' order by '+@order
end
else
begin
set @strSQL = 'select top '+str(@pagesize)+' '+str(@datacount)+' as datacount, '+str(@pagecount)+' as pagecount, '+@columns+'
from '+@tbName+' where '+@keyIndex+'
not in(select top '+str((@pageindex-1)*@pagesize)+' '+@keyIndex+'
from '+@tbName+' where 1=1 '+@where+' order by '+@order+')
'+@where+' order by '+@order
end
exec (@strSQL)
go
--调用示例:对表dict分页,每页10条,显示第一页,Id为标识字段
exec Cdt_changePage 10,1,'dict','*','Id','','Id asc'
------------------------------------
--用途:分页存储过程(对有主键的表效率极高)
--说明:
------------------------------------
CREATE PROCEDURE UP_GetRecordByPage
@tblName varchar(255), -- 表名
@fldName varchar(255), -- 主键字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@IsReCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(6000) -- 主语句
declare @strTmp varchar(100) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @fldName +'] desc'
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @fldName +'] asc'
end
set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
+ @strOrder
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
if @PageIndex = 1
begin
set @strTmp =''
if @strWhere != ''
set @strTmp = ' where ' + @strWhere
set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
+ @tblName + ']' + @strTmp + ' ' + @strOrder
end
if @IsReCount != 0
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'+' where ' + @strWhere
exec (@strSQL)