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',''