/*---------------------------------------------------------------------------------- -- 名稱 :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