欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

通用分页存储过程

程序员文章站 2022-03-04 20:09:46
...
/*----------------------------------------------------------------------------------
--   名稱 :Pro_CommonPager
--   功能說明:萬能分頁程序
--   輸入資料:
  @PageIndex int,--索引页 1
  @PageSize int,--每页数量2
  @TableName nvarchar(500),--查询表名3
  @Order  nvarchar(500),--排序的列4
  @SelectStr nvarchar(500) = '*',--查询的列5
  @WhereCondition Nvarchar(1000)='',--查询条件6
  @OrderType bit = 0, -- 设置排序类型, 非 0 值则降序 7
  @Groupby NVarChar(100) = '' ,--分組 8
--   輸出資料: 
  @RecordCount int = -1 out,--总行数9
  @PageCount int = -1 out,--总页数10
  @error nvarchar(100)='' out --錯誤信息11
--   注意事項:exec Pro_CommonPager 5000,15,'[User]','Id'
  本程序本摘自網上﹐經過修改﹐提高了它的效率。
--   原設計者:Achieve
--   設立日期:2008/05/15
--   ------------------------ 異動紀錄明細 -------------------------------
--   異動日期 異動者  異  動  原  因
--  2008/05/25 me  发现了一另外一种计算总行数的方法,这种方法应该还是比临时表快
    EXEC SP_EXECUTESQL @strTmp,N'@RecordCount int output',@RecordCount output
-----------------------------------------------------------------------------------*/
CREATE   PROCEDURE [dbo].[Pro_CommonPager]
(
@PageIndex int,--索引页 1
@PageSize int,--每页数量2
@TableName nvarchar(500),--查询表名3
@Order  nvarchar(500),--排序的列4
@SelectStr nvarchar(500) = '*',--查询的列5
@WhereCondition Nvarchar(1000)='',--查询条件6
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序 7
@Groupby NVarChar(100) = '' ,--分組 8
@RecordCount int=-1 output,--总行数 9
@PageCount int=-1 output,--总页数10
@error nvarchar(100)='' output --錯誤信息11
)
AS 
declare @strSQL nvarchar(2000) -- 主语句 
declare @strTmp nvarchar(1000) -- 临时变量 
declare @strOrder nvarchar(1000) -- 排序类型 
if @OrderType != 0 
begin 
 set @strTmp = '<(select min' 
 set @strOrder = ' order by ' + @Order +' desc' 
end 
else 
begin 
 set @strTmp = '>(select max' 
 set @strOrder = ' order by ' + @Order +' asc' 
end 

set @strSQL = 'select top ' + str(@PageSize) + ' ' + @SelectStr + ' from ' 
 + @TableName + ' where ' + @Order + '' + @strTmp + '([' 
 + @Order + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
 + @Order + '] from ' + @TableName + '' + @strOrder + ') as tblTmp)' 
 + @Groupby + @strOrder 
if @WhereCondition != '' 
 set @strSQL = 'select top ' + str(@PageSize) + ' ' + @SelectStr + ' from ' 
  + @TableName + ' where ' + @Order + '' + @strTmp + '([' 
  + @Order + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
  + @Order + '] from ' + @TableName + ' where (' + @WhereCondition + ') ' 
  + @strOrder + ') as tblTmp) and (' + @WhereCondition + ') ' + @Groupby + @strOrder 
if @PageIndex = 1 
begin 
 set @strTmp = '' 
 if @WhereCondition != '' 
  set @strTmp = ' where (' + @WhereCondition + ')' 
 set @strSQL = 'select top ' + str(@PageSize) + ' ' + @SelectStr + ' from ' 
  + @TableName + '' + @strTmp + ' ' + @Groupby + @strOrder 
end 
exec (@strSQL)
if(@@error<>0)
begin
 set @error='分頁數據出錯﹗';
 return;
end 
--print @strSQL
 --改進本業計算行數的方法﹐創建一個臨時表用于快速計算行數
 --create table  #tmp ( counts int );---創建臨時表
 --取得總記錄數
 IF @WhereCondition <>''
  Begin
   SET @strTmp = 'SELECT  @RecordCount=Count(*) FROM ' + @TableName + ' Where ' + (@WhereCondition)
  End
 ELSE
  Begin
   SET @strTmp = 'SELECT @RecordCount=Count(*) FROM ' + @TableName
  End
 EXEC SP_EXECUTESQL @strTmp,N'@RecordCount int output',@RecordCount output
 if(@@error<>0)
 begin
  set @error='分頁數據出錯﹗';
  --drop table #tmp;
  return;
 end 
 
 --select @RecordCount=counts from #tmp
 --SET @RecordCount = @@RowCount
  --    获取总页数
 --    "CEILING"函数:取得不小于某数的最小整数
 SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize)

 if(@@error<>0)
 begin
  set @error='分頁數據出錯﹗';
  --drop table #tmp;
 end 
 return

GO

 

相关标签: Go