sql分页存储过程,带求和排序

Posted 圣叹&北京

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql分页存储过程,带求和排序相关的知识,希望对你有一定的参考价值。

  • 创建存储过程:
 
CREATE PROCEDURE [dbo].[sp_TBTest_Query]
    ( 
        @PageSize INT,                        --每页多少条记录
        @PageIndex INT = 1,                    --指定当前为第几页
        @PageCount INT    OUTPUT,                --返回总页数
        @RecordCount INT OUTPUT,            --记录总和

        @OrderField VARCHAR(5000),            --排序字段(多字段,不含Order By)
        @strWhere VARCHAR(5000),            --条件语句(不用加where)

        @SumColumnNames NVARCHAR(200),        --汇总字段
        @SumResult NVARCHAR(200) OUTPUT        --返回汇总结果
    )
AS
    BEGIN
        DECLARE @SQL NVARCHAR(MAX) = \'\';
        --条件处理
        IF ISNULL(@strWhere, \'\') =\'\'
        BEGIN
          SET @strWhere=\'1=1 \'
        end
         
         
        --计算总记录数
        SET @SQL = N\'SELECT @A = count(*) FROM TBTest where \'+ @strWhere
        EXEC sp_executesql @SQL, N\'@A int OUTPUT\', @RecordCount OUTPUT;

        --计算总页数
        SELECT  @PageCount = CEILING(( @RecordCount + 0.0 ) / @PageSize);
        
        --处理页数超出范围情况
        IF @PageIndex <= 0
            SET @PageIndex = 1;
    
        IF @PageIndex > @PageCount
            SET @PageIndex = @PageCount;
            
         --处理开始点和结束点
        DECLARE @StartRecord INT;
        DECLARE @EndRecord INT;
    
        SET @StartRecord = ( @PageIndex - 1 ) * @PageSize + 1;
        SET @EndRecord = @StartRecord + @PageSize - 1;

        --计算汇总
        IF ISNULL(@SumColumnNames, \'\') <> \'\'
            BEGIN
                SET @SQL = N\'SELECT @A = (CAST(ISNULL(SUM(\'
                    + REPLACE(@SumColumnNames, \',\',\'), 0) AS NVARCHAR(30)) + \'\',\'\' + CAST(ISNULL(SUM(\')
                    + \'), 0) AS NVARCHAR(30))) FROM TBTest where \'+@strWhere +\' \'
                EXEC sp_executesql @SQL, N\'@A NVARCHAR(200) OUTPUT\', @SumResult OUTPUT;
            END 
             
         
        --返回结果
       SET @sql=N\' SELECT * FROM (  SELECT  * ,ROW_NUMBER() OVER(ORDER BY id DESC) AS RowID
        FROM    TBTest where \'+@strWhere +N\') t
        WHERE   RowID BETWEEN \'+CONVERT(NVARCHAR(10),@StartRecord)+N\' AND \'+CONVERT(NVARCHAR(10),@EndRecord)
        EXEC sp_executesql @SQL
    END

 

 

  • 调用代码

 

     DECLARE    @PageSize INT=10,                        --每页多少条记录
        @PageIndex INT = 2,                    --指定当前为第几页
        @PageCount INT     ,                --返回总页数
        @RecordCount INT  ,            --记录总和

        @OrderField VARCHAR(5000)=\'ID\',            --排序字段(多字段,不含Order By)
        @strWhere VARCHAR(5000)=\'\',            --条件语句(不用加where)

        @SumColumnNames NVARCHAR(200)=\'Age\',        --汇总字段
        @SumResult NVARCHAR(200)          --返回汇总结果


EXEC   sp_TBTest_Query  @PageSize,@PageIndex,@PageCount OUTPUT,@RecordCount OUTPUT,@OrderField,@strWhere,@SumColumnNames,@SumResult OUTPUT

SELECT @PageCount AS \'PageCount\',@RecordCount AS \'RecordCount\',@SumResult AS \'SUM\'
  • 测试结果

我在项目中遇到一个问题,就是元数据由分组,然后再连接,为了加快查询效率,我不得不剔除传入Where条件字符串中的一个条件,大概写法如下:

DECLARE @strWhere NVARCHAR(max)=\'ID=1 and Age=2 and address=\'\'销售部\'\'\'
DECLARE @str1 NVARCHAR(max)=\'\'
DECLARE @str2 NVARCHAR(max)=\'\'
IF ISNULL(@strWhere, \'\')<>\'\'
BEGIN
IF( CHARINDEX(\'Age\',@strWhere)>0 )
BEGIN
SET @str1 =SUBSTRING(@strWhere,CHARINDEX(\'Age\',@strWhere),LEN(@strWhere))
if CHARINDEX(\'and\',@str1)>0
begin
SET @str2 =SUBSTRING(@str1,CHARINDEX(\'and\',@str1),LEN(@str1))
end

SET @strWhere=SUBSTRING(@strWhere,0,CHARINDEX(\'Age\',@strWhere))+N\' 1=1 \'+@str2

end

END

 

以上是关于sql分页存储过程,带求和排序的主要内容,如果未能解决你的问题,请参考以下文章

sql server 带输入输出参数的分页存储过程(效率最高)

T-SQL分页功能存储过程

基于Dapper的分页实现,支持筛选,排序,结果集总数,非存储过程

SQL 分页查询存储过程中order by 后面不能传变量的问题怎么解决

mybatis动态sql片段与分页,排序,传参的使用

高效多表分页存储过程,可支持多表查询,任意排序