通用分页存储过程

 1 CREATE PROCEDURE [dbo].[P_PageByRownumber]
 2 (
 3      @tbName VARCHAR(255),                        --表名
 4      @tbGetFields VARCHAR(max)= '*',        --返回字段
 5      @OrderfldName VARCHAR(255),                 --排序的字段名
 6      @PageSize INT=20,                            --页尺寸
 7      @PageIndex INT=1,                            --页码
 8      @OrderType bit = 0,                          --0升序,非0降序
 9      @strWhere VARCHAR(max)='',                   --查询条件
10      @TotalCount INT OUTPUT                       --返回总记录数
11  )
12  AS
13  BEGIN
14      DECLARE @strSql VARCHAR(max)                  --主语句
15      DECLARE @strSqlCount NVARCHAR(max)            --查询记录总数主语句
16      DECLARE @strOrder VARCHAR(300)                -- 排序类型
17      DECLARE @RecoderCount int                     --总记录数
18     --------------总记录数---------------
19      set @strWhere=replace(@strWhere,'&dyh','''')
20      IF ISNULL(@strWhere,'') <>'' 
21           SET @strSqlCount='Select @TotalCout=count(*) from  ' + @tbName + ' where 1=1 '+ @strWhere
22      ELSE SET @strSqlCount='Select @TotalCout=count(*) from  ' + @tbName
23      
24      --exec(@strSqlCount)
25      exec sp_executesql @strSqlCount,N'@TotalCout int output',@TotalCount output
26      --------------分页------------
27      IF @PageIndex <= 0 SET @PageIndex = 1
28  
29      IF(@OrderType<>0) SET @strOrder=' ORDER BY '+@OrderfldName+' DESC '
30      ELSE SET @strOrder=' ORDER BY '+@OrderfldName+' ASC '
31  
32      SET @strSql='SELECT * FROM 
33      (SELECT ROW_NUMBER() OVER('+@strOrder+') RowNo,'+ @tbGetFields+' FROM ' + @tbName + ' WHERE 1=1 ' + @strWhere+' ) tb 
34      WHERE tb.RowNo BETWEEN '+str((@PageIndex-1)*@PageSize+1)+' AND ' +str(@PageIndex*@PageSize)
35  
36      exec(@strSql)
37  END
38 GO

PS.查询条件参数字符串中单引号用'&dyh'代替,转义问题未解决,暂时用特殊字符替换处理了。

原文地址:https://www.cnblogs.com/servant/p/4447963.html