通用分页存储过程
程序员文章站
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
上一篇: 第一课时 基于MNIST数据集
下一篇: golang教程之函数