分页存储过程

来源:互联网 发布:ip地址mac绑定的目的 编辑:程序博客网 时间:2024/05/17 13:41
create proc Hy_Comm_Page
@TableName varchar(100),--表名
@Key varchar(100),--主键名(id)
@Field varchar(500)='*',--查询字段
@where varchar(200),--查询条件 (参数不带where)
@Order varchar(100),--排序(id desc)
@Size int=10,--每页数据数
@Index int=1,--当前为第几页 
@Count int output--总纪录数
as
begin
declare @sql nvarchar(1000)=''
declare @orderStr varchar(100)=''
declare @whereStr varchar(200)=''
--判断排序
if(LEN(@Order)>0 )
set @orderStr=' order by '+@Order
--判断查询条件
if(LEN(@where)>0 )
set @whereStr=' where '+@where
--得到总纪录数
set @sql='select @CountVal=count(*) from '+@TableName+@whereStr
exec sp_executesql @sql,N'@CountVal int output',@CountVal=@Count  output  --总纪录数
--如果是第一页(提高效率)
if(@Index=1)
begin
set @sql='select top '+ltrim(str(@Size))+' '+@Field+' from '+@TableName+@whereStr+@orderStr
end
else
begin
declare @start int
declare @end int
if(@Count>@Size*(@Index-1))--所取纪录行存在
begin
set @start=@Size*(@Index-1)+1
set @end=@Size*@Index
if(@end>@Count)
set @end=@Count
declare @Row_NumOrder varchar(100)
--如果指定排序 为ROW_NUMBER指定 否则默认主键
if(LEN(@orderStr)=0)
set @Row_NumOrder=' order by '+@Key
else
set @Row_NumOrder=@orderStr
set @sql='select '+@Field+' from ( select ROW_NUMBER() over('+@Row_NumOrder+')as row_num, '+@Field+' from '+@TableName+@whereStr+') as t1  where row_num between '+LTRIM(str(@start))+' and '+LTRIM(str(@end))+@orderStr 
end
else
set @sql=''
end
--print @sql
exec (@sql)
end
原创粉丝点击