存储过程分页 (多条件拼接)



alter proc sp_PagedByConditions ( @CountryCode nvarchar(
20),--国家编号 @CId int,--城市的ID @PageIndex int =1,--当前要显示的页码 @PageSize int=3, --每页要显示的数据条数(页大小) @TotalPages int out --总页数,一个输出参数 ) as begin --定义的变量,一定要给初始值 declare @sqlWhere nvarchar(max)='' ,@sqlPaged nvarchar(max)='' if(@CountryCode!='') begin set @sqlWhere+=' and CountryCode='''+@CountryCode+'''' --'and CountryCode='''+CHN+'''' end if(@CId<>0) begin set @sqlWhere+=' and ID='+CAST(@CId as nvarchar(20)) end set @sqlPaged = 'select top('+cast(@PageSize as nvarchar(20))+') * from (select ROW_NUMBER() over(order by ID) as 行号,* from city where 1=1 '+@sqlWhere+' ) t where 行号>'+cast(((@PageIndex-1)*@PageSize) as nvarchar(20)) exec sp_executesql @sqlPaged --================取得要分页的总数据量,计算总页数================================================================ declare @sqlCount int=0 ,@sqlstr nvarchar(max)='' set @sqlstr='select @c= count(*) from city where 1=1'+@sqlWhere exec sp_executesql @sqlstr,N'@c int out',@sqlCount out set @TotalPages=CEILING(@sqlCount*1.0/@PageSize) end go declare @c int exec sp_PagedByConditions 'CHN',0,1,5,@c out select @c

万能存储过程展示:

/*    ==脚本参数==

    源服务器版本 : SQL Server 2017 (14.0.1000)
    源数据库引擎版本 : Microsoft SQL Server Enterprise Edition
    源数据库引擎类型 : 独立的 SQL Server

    目标服务器版本 : SQL Server 2017
    目标数据库引擎版本 : Microsoft SQL Server Standard Edition
    目标数据库引擎类型 : 独立的 SQL Server
*/

USE [BAWEI]
GO
/****** Object:  StoredProcedure [dbo].[Proc_Pager]    Script Date: 2020/6/9 8:56:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[Proc_Pager]
    @TableName VARCHAR(50),            --表名
    @ReFieldsStr VARCHAR(200) = '*',   --字段名(全部字段为*)
    @OrderString VARCHAR(200),         --排序字段(必须)
    @WhereString VARCHAR(500) =N'',  --条件语句(不用加where)
    @PageSize int,                     --每页多少条记录
    @PageIndex INT = 1 ,               --指定当前为第几页
    @TotalRecord INT OUTPUT            --返回总记录数
AS
BEGIN
     --处理开始点和结束点
    DECLARE @StartRecord INT;
    DECLARE @EndRecord INT; 
    DECLARE @TotalCountSql NVARCHAR(500); 
    DECLARE @SqlString NVARCHAR(2000);    
    SET @StartRecord = (@PageIndex-1)*@PageSize + 1--起始记录
    SET @EndRecord = @StartRecord + @PageSize - 1 --结尾记录
    SET @TotalCountSql= N'select @TotalRecord = count(*) from ' + @TableName;--总记录数语句
    SET @SqlString = N'(select row_number() over (order by '+ @OrderString +') as rowId,'+@ReFieldsStr+' from '+ @TableName;--查询语句
    --
    IF (@WhereString! = '' or @WhereString!=null)
        BEGIN
            SET @TotalCountSql=@TotalCountSql + '  where '+ @WhereString;
            SET @SqlString =@SqlString+ '  where '+ @WhereString;            
        END
    --第一次执行得到
    EXEC sp_executesql @totalCountSql,N'@TotalRecord int out',@TotalRecord OUTPUT;--返回总记录数
    ----执行主语句
    SET @SqlString ='select * from ' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' +  ltrim(str(@EndRecord));
    Exec(@SqlString)    
END
多表联查调用
exec Proc_Pager ' student a inner join b on a.s_id=b.t_id',''
原文地址:https://www.cnblogs.com/cf425/p/13448988.html