抛砖引玉——通用分页存储过程(SqlServer2005)
从网上看了很多分页的存储过程,没有发现一个所有表通用的!也许有更高的招,只是我自己不知道而已,特发此贴,以集思广益。
我先发一个我自己写的通用分页存储过程,希望前辈、哥哥姐姐、弟弟妹妹们批评指正,本人不胜感激。
代码
--@Columns 要得到的列
--@TableName 表名(可做联合查询)
--@Condition 查询条件
--@OrderBy 排序规则
--@PageNum 第几页
--@PageSize 每页有多少务记录
--@PageCount 输出总页数
--@RecordCount 输出总记录数
Create Procedure proc_CurrencyPage
(
@Columns varchar(max),
@TableName varchar(max),
@Condition varchar(max),
@OrderBy varchar(max),
@PageNum int,
@PageSize int,
@PageCount int output,
@RecordCount bigint output
)
AS
DECLARE @Sql nvarchar(max);
Set @Sql = 'Select @CountOut = Count(*) From ' + @TableName + ' Where ' + @Condition;
EXEC sp_executesql @Sql,N'@CountOut INT OUTPUT',@CountOut = @RecordCount OUTPUT;
Set @PageCount = @RecordCount / @PageSize;
IF(@RecordCount % @PageSize > 0) Set @PageCount = @PageCount + 1;
IF(@PageNum < 1) Set @PageNum = 1;
IF(@PageNum > @PageCount) Set @PageNum = @PageCount;
Declare @BRowNum int,@ERowNum int;
Set @BRowNum = (@PageNum - 1) * @PageSize;
Set @ERowNum = @BRowNum + @PageSize;
Set @Sql =
'Select * From (
Select '+@Columns+', ROW_NUMBER() Over(Order By ' + @OrderBy + ') As RowNum
From ' + @TableName + '
Where ' + @Condition + '
) as TempT
Where RowNum > ' + Convert(varchar(10),@BRowNum) + '
And
RowNum <= ' + Convert(varchar(10),@ERowNum) + '
Order By ' + @OrderBy;
Exec(@Sql);
GO
--测试:
Declare @Columns varchar(max)
Declare @TableName varchar(max)
Declare @Condition varchar(max)
Declare @OrderBy varchar(max)
Declare @PageNum int
Declare @PageSize int
Declare @PageCount int
Declare @RecordCount bigint
set @Columns = 'ID,ReportID,ReportCondition'
set @TableName = '[PSYT_TS_ReportSort]'
set @Condition = 'ReportSort = ''Z'''
set @ORDERBY = 'ID'
set @PageNum = 2
set @PageSize=20
Exec proc_CurrencyPage @Columns,@TableName,@Condition,@ORDERBY,@PageNum,@PageSize,@PageCount output,@RecordCount output
--@TableName 表名(可做联合查询)
--@Condition 查询条件
--@OrderBy 排序规则
--@PageNum 第几页
--@PageSize 每页有多少务记录
--@PageCount 输出总页数
--@RecordCount 输出总记录数
Create Procedure proc_CurrencyPage
(
@Columns varchar(max),
@TableName varchar(max),
@Condition varchar(max),
@OrderBy varchar(max),
@PageNum int,
@PageSize int,
@PageCount int output,
@RecordCount bigint output
)
AS
DECLARE @Sql nvarchar(max);
Set @Sql = 'Select @CountOut = Count(*) From ' + @TableName + ' Where ' + @Condition;
EXEC sp_executesql @Sql,N'@CountOut INT OUTPUT',@CountOut = @RecordCount OUTPUT;
Set @PageCount = @RecordCount / @PageSize;
IF(@RecordCount % @PageSize > 0) Set @PageCount = @PageCount + 1;
IF(@PageNum < 1) Set @PageNum = 1;
IF(@PageNum > @PageCount) Set @PageNum = @PageCount;
Declare @BRowNum int,@ERowNum int;
Set @BRowNum = (@PageNum - 1) * @PageSize;
Set @ERowNum = @BRowNum + @PageSize;
Set @Sql =
'Select * From (
Select '+@Columns+', ROW_NUMBER() Over(Order By ' + @OrderBy + ') As RowNum
From ' + @TableName + '
Where ' + @Condition + '
) as TempT
Where RowNum > ' + Convert(varchar(10),@BRowNum) + '
And
RowNum <= ' + Convert(varchar(10),@ERowNum) + '
Order By ' + @OrderBy;
Exec(@Sql);
GO
--测试:
Declare @Columns varchar(max)
Declare @TableName varchar(max)
Declare @Condition varchar(max)
Declare @OrderBy varchar(max)
Declare @PageNum int
Declare @PageSize int
Declare @PageCount int
Declare @RecordCount bigint
set @Columns = 'ID,ReportID,ReportCondition'
set @TableName = '[PSYT_TS_ReportSort]'
set @Condition = 'ReportSort = ''Z'''
set @ORDERBY = 'ID'
set @PageNum = 2
set @PageSize=20
Exec proc_CurrencyPage @Columns,@TableName,@Condition,@ORDERBY,@PageNum,@PageSize,@PageCount output,@RecordCount output