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 带输入输出参数的分页存储过程(效率最高)
基于Dapper的分页实现,支持筛选,排序,结果集总数,非存储过程