读书人

求支持任意SQL语句的分页存储过程解决

发布时间: 2012-03-20 14:01:11 作者: rapoo

求支持任意SQL语句的分页存储过程
求支持任意SQL语句的分页存储过程(支持多表查询)
要求不用输入字段。
直接给一条SQL语句 和 PAGESIZE

返回结果


[解决办法]

SQL code
Create PROC P_viewPage             /**//*              nzperfect [no_mIss] 高效通用分页存储过程(双向检索) 2007.5.7  QQ:34813284              敬告:适用于单一主键或存在唯一值列的表或视图              ps:Sql语句为8000字节,调用时请注意传入参数及sql总长度不要超过指定范围              */              @TableName VARCHAR(200),     --表名              @FieldList VARCHAR(2000),    --显示列名,如果是全部字段则为*              @PrimaryKey VARCHAR(100),    --单一主键或唯一值键              @Where VARCHAR(2000),        --查询条件 不含'where'字符,如id>10 and len(userid)>9              @Order VARCHAR(1000),        --排序 不含'order by'字符,如id asc,userid desc,必须指定asc或desc              --注意当@SortType=3时生效,记住一定要在最后加上主键,否则会让你比较郁闷              @SortType INT,               --排序规则 1:正序asc 2:倒序desc 3:多列排序方法              @RecorderCount INT,          --记录总数 0:会返回总记录              @PageSize INT,               --每页输出的记录数              @PageIndex INT,              --当前页数              @TotalCount INT OUTPUT ,      --记返回总记录              @TotalPageCount INT OUTPUT   --返回总页数          AS          SET NOCOUNT ON              IF ISNULL(@TotalCount,'') = '' SET @TotalCount = 0              SET @Order = RTRIM(LTRIM(@Order))              SET @PrimaryKey = RTRIM(LTRIM(@PrimaryKey))              SET @FieldList = REPLACE(RTRIM(LTRIM(@FieldList)),' ','')              WHILE CHARINDEX(', ',@Order) > 0 or CHARINDEX(' ,',@Order) > 0                  BEGIN                      SET @Order = REPLACE(@Order,', ',',')                      SET @Order = REPLACE(@Order,' ,',',')                  END              IF ISNULL(@TableName,'') = '' or ISNULL(@FieldList,'') = ''                      or ISNULL(@PrimaryKey,'') = ''                      or @SortType < 1 or @SortType >3                      or @RecorderCount  < 0 or @PageSize < 0 or @PageIndex < 0                  BEGIN                      PRINT('ERR_00')                      RETURN                  END              IF @SortType = 3                  BEGIN                      IF (UPPER(RIGHT(@Order,4))!=' ASC' AND UPPER(RIGHT(@Order,5))!=' DESC')                          BEGIN PRINT('ERR_02') RETURN END                  END              DECLARE @new_where1 VARCHAR(1000)              DECLARE @new_where2 VARCHAR(1000)              DECLARE @new_order1 VARCHAR(1000)              DECLARE @new_order2 VARCHAR(1000)              DECLARE @new_order3 VARCHAR(1000)              DECLARE @Sql VARCHAR(8000)              DECLARE @SqlCount NVARCHAR(4000)              IF ISNULL(@where,'') = ''                  BEGIN                      SET @new_where1 = ' '                      SET @new_where2 = ' Where  '                  END              ELSE                  BEGIN                      SET @new_where1 = ' Where ' + @where                      SET @new_where2 = ' Where ' + @where + ' AND '                  END              IF ISNULL(@order,'') = '' or @SortType = 1  or @SortType = 2                  BEGIN                      IF @SortType = 1                          BEGIN                              SET @new_order1 = ' orDER BY ' + @PrimaryKey + ' ASC'                              SET @new_order2 = ' orDER BY ' + @PrimaryKey + ' DESC'                          END                      IF @SortType = 2                          BEGIN                              SET @new_order1 = ' orDER BY ' + @PrimaryKey + ' DESC'                              SET @new_order2 = ' orDER BY ' + @PrimaryKey + ' ASC'                          END                  END              ELSE                  BEGIN                      SET @new_order1 = ' orDER BY ' + @Order                  END                  IF @SortType = 3 AND  CHARINDEX(','+@PrimaryKey+' ',','+@Order)>0              BEGIN                  SET @new_order1 = ' orDER BY ' + @Order                  SET @new_order2 = @Order + ','                  SET @new_order2 = REPLACE(REPLACE(@new_order2,'ASC,','{ASC},'),'DESC,','{DESC},')                  SET @new_order2 = REPLACE(REPLACE(@new_order2,'{ASC},','DESC,'),'{DESC},','ASC,')                  SET @new_order2 = ' orDER BY ' + SUBSTRING(@new_order2,1,LEN(@new_order2)-1)                  IF @FieldList <> '*'                      BEGIN                          SET @new_order3 = REPLACE(REPLACE(@Order + ',','ASC,',','),'DESC,',',')                          SET @FieldList = ',' + @FieldList                          WHILE CHARINDEX(',',@new_order3)>0                              BEGIN                                  IF CHARINDEX(SUBSTRING(','+@new_order3,1,CHARINDEX(',',@new_order3)),','+@FieldList+',')>0                                      BEGIN                                          SET @FieldList =                                          @FieldList + ',' + SUBSTRING(@new_order3,1,CHARINDEX(',',@new_order3))                                      END                                  SET @new_order3 =                                  SUBSTRING(@new_order3,CHARINDEX(',',@new_order3)+1,LEN(@new_order3))                              END                          SET @FieldList = SUBSTRING(@FieldList,2,LEN(@FieldList))                      END                  END                  SET @SqlCount = 'Select @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'              + CAST(@PageSize AS VARCHAR)+') FROM (Select * FROM ' + @TableName + @new_where1+') AS T'              IF @RecorderCount  = 0                  BEGIN                      EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',                      @TotalCount OUTPUT,@TotalPageCount OUTPUT                  END              ELSE                  BEGIN                      Select @TotalCount = @RecorderCount                END              IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)                  BEGIN                      SET @PageIndex =  CEILING((@TotalCount+0.0)/@PageSize)                  END              IF @PageIndex = 1 or @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)                  BEGIN                      IF @PageIndex = 1 --返回第一页数据                          BEGIN                              SET @Sql = 'Select * FROM (Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '                              + @TableName + @new_where1 + @new_order1 +') AS TMP ' + @new_order1                    END                      IF @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)  --返回最后一页数据                          BEGIN                              SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('                              + 'Select TOP ' + STR(ABS(@PageSize*@PageIndex-@TotalCount-@PageSize))                              + ' ' + @FieldList + ' FROM '                              + @TableName + @new_where1 + @new_order2 + ' ) AS TMP '                              + @new_order1                          END                  END              ELSE 


[解决办法]

SQL code
                    BEGIN                  IF @SortType = 1  --仅主键正序排序                      BEGIN                          IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索                              BEGIN                                  SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '                                  + @TableName + @new_where2 + @PrimaryKey + ' > '                                  + '(Select MAX(' + @PrimaryKey + ') FROM (Select TOP '                                  + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey                                  + ' FROM ' + @TableName                                  + @new_where1 + @new_order1 +' ) AS TMP) '+ @new_order1                              END                          ELSE  --反向检索                              BEGIN                                  SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('                                  + 'Select TOP ' + STR(@PageSize) + ' '                                  + @FieldList + ' FROM '                                  + @TableName + @new_where2 + @PrimaryKey + ' < '                                  + '(Select MIN(' + @PrimaryKey + ') FROM (Select TOP '                                 + STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey                                  + ' FROM ' + @TableName                                  + @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2                                  + ' ) AS TMP ' + @new_order1                              END                      END                  IF @SortType = 2  --仅主键反序排序                      BEGIN                          IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索                              BEGIN                                  SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '                                  + @TableName + @new_where2 + @PrimaryKey + ' < '                                  + '(Select MIN(' + @PrimaryKey + ') FROM (Select TOP '                                  + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey                                  +' FROM '+ @TableName                                  + @new_where1 + @new_order1 + ') AS TMP) '+ @new_order1                              END                          ELSE  --反向检索                              BEGIN                                  SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('                                  + 'Select TOP ' + STR(@PageSize) + ' '                                  + @FieldList + ' FROM '                                  + @TableName + @new_where2 + @PrimaryKey + ' > '                                  + '(Select MAX(' + @PrimaryKey + ') FROM (Select TOP '                                  + STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey                                  + ' FROM ' + @TableName                                  + @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2                                  + ' ) AS TMP ' + @new_order1                              END                      END                  IF @SortType = 3  --多列排序,必须包含主键,且放置最后,否则不处理                      BEGIN                          IF CHARINDEX(',' + @PrimaryKey + ' ',',' + @Order) = 0                              BEGIN PRINT('ERR_02') RETURN END                              IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索                                  BEGIN                                      SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '                                      + 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '                                      + ' Select TOP ' + STR(@PageSize*@PageIndex) + ' ' + @FieldList                                      + ' FROM ' + @TableName + @new_where1 + @new_order1 + ' ) AS TMP '                                      + @new_order2 + ' ) AS TMP ' + @new_order1                                  END                              ELSE  --反向检索                                  BEGIN                                      SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '                                      + 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '                                      + ' Select TOP ' + STR(@TotalCount-@PageSize *@PageIndex+@PageSize) + ' ' + @FieldList                                      + ' FROM ' + @TableName + @new_where1 + @new_order2 + ' ) AS TMP '                                      + @new_order1 + ' ) AS TMP ' + @new_order1                                  END                      END                  END              PRINT(@SQL)              EXEC(@Sql) 


[解决办法]

SQL code
                    BEGIN                  IF @SortType = 1  --仅主键正序排序                      BEGIN                          IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索                              BEGIN                                  SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '                                  + @TableName + @new_where2 + @PrimaryKey + ' > '                                  + '(Select MAX(' + @PrimaryKey + ') FROM (Select TOP '                                  + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey                                  + ' FROM ' + @TableName                                  + @new_where1 + @new_order1 +' ) AS TMP) '+ @new_order1                              END                          ELSE  --反向检索                              BEGIN                                  SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('                                  + 'Select TOP ' + STR(@PageSize) + ' '                                  + @FieldList + ' FROM '                                  + @TableName + @new_where2 + @PrimaryKey + ' < '                                  + '(Select MIN(' + @PrimaryKey + ') FROM (Select TOP '                                 + STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey                                  + ' FROM ' + @TableName                                  + @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2                                  + ' ) AS TMP ' + @new_order1                              END                      END                  IF @SortType = 2  --仅主键反序排序                      BEGIN                          IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索                              BEGIN                                  SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '                                  + @TableName + @new_where2 + @PrimaryKey + ' < '                                  + '(Select MIN(' + @PrimaryKey + ') FROM (Select TOP '                                  + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey                                  +' FROM '+ @TableName                                  + @new_where1 + @new_order1 + ') AS TMP) '+ @new_order1                              END                          ELSE  --反向检索                              BEGIN                                  SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('                                  + 'Select TOP ' + STR(@PageSize) + ' '                                  + @FieldList + ' FROM '                                  + @TableName + @new_where2 + @PrimaryKey + ' > '                                  + '(Select MAX(' + @PrimaryKey + ') FROM (Select TOP '                                  + STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey                                  + ' FROM ' + @TableName                                  + @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2                                  + ' ) AS TMP ' + @new_order1                              END                      END                  IF @SortType = 3  --多列排序,必须包含主键,且放置最后,否则不处理                      BEGIN                          IF CHARINDEX(',' + @PrimaryKey + ' ',',' + @Order) = 0                              BEGIN PRINT('ERR_02') RETURN END                              IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索                                  BEGIN                                      SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '                                      + 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '                                      + ' Select TOP ' + STR(@PageSize*@PageIndex) + ' ' + @FieldList                                      + ' FROM ' + @TableName + @new_where1 + @new_order1 + ' ) AS TMP '                                      + @new_order2 + ' ) AS TMP ' + @new_order1                                  END                              ELSE  --反向检索                                  BEGIN                                      SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '                                      + 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '                                      + ' Select TOP ' + STR(@TotalCount-@PageSize *@PageIndex+@PageSize) + ' ' + @FieldList                                      + ' FROM ' + @TableName + @new_where1 + @new_order2 + ' ) AS TMP '                                      + @new_order1 + ' ) AS TMP ' + @new_order1                                  END                      END                  END              PRINT(@SQL)              EXEC(@Sql) 


[解决办法]

SQL code
ALTER proc [dbo].[sp_GetPage](    @SqlQuery  varchar(2000),    --要分页的查询语句    @ColumnName  varchar(40),    --排序字段    @SortType varchar(4),        --排序规则 1:正序asc 2:倒序desc 3:多列排序方法                     @PageSize varchar(10),       --每页输出的记录数              @PageIndex varchar(4),       --当前页数              @TotalCount INT=0 OUTPUT ,     --记返回总记录              @TotalPageCount INT=0 OUTPUT   --返回总页数    )asbegin declare @sqlBasic varchar(2000)-------- 取总记录数和总页数----------DECLARE @SQLStringCount nvarchar(1000);DECLARE @ParmDefinition nvarchar(50);SET @SQLStringCount = N'SELECT @totalOUT = count(1)    FROM ('+@SqlQuery+') tt';SET @ParmDefinition = N'@totalOUT varchar(30) OUTPUT';EXECUTE sp_executesql @SQLStringCount, @ParmDefinition, @totalOUT=@TotalCount OUTPUT;set @TotalPageCount = CEILING(@TotalCount * 1.0 / @PageSize)----------------set @sqlBasic='SELECT * FROM(  select *,ROW_NUMBER() OVER (ORDER BY '+@ColumnName+' '+ @SortType +') as SerialNumber from    ('+    @SqlQuery    +') AS tt   ) TWHERE T.SerialNumber > (('+@PageIndex+'-1) * '+@PageSize+')  and T.SerialNumber <= ('+@PageIndex+' *'+@PageSize+')'--print @sqlBasicexec(@sqlBasic)     end
[解决办法]
哦,你要简单的?
这个最简单!
SQL code
CREATE PROC sp_PageIndex@sqlSelect varchar(800), --SELECT 后面 FROM 前面 的 字段 不用包含SELECT@sqlFrom varchar(800), --FROM 后面 的 字段 包含FROM@countPerPage int, -- 每页数据行数@toPage int --要转到的页码ASBEGIN-- 根据每页数据行数 和 要转到的页码 得到 数据起止点Declare @start intDeclare @end intset @end = @countPerPage * @toPageset @start = @countPerPage * (@toPage - 1) + 1-- 临时表名称 可随机命名Declare @tmpTable varchar(10)SET @tmpTable ='#tmp'Declare @sqlStr varchar(800)-- 创建数据源到临时表SELECT @sqlStr = 'SELECT Identity(int,1,1) AS RowIndex,'SELECT @sqlStr = @sqlStr + rtrim(@sqlSelect) + ' INTO  '+ @tmpTable SELECT @sqlStr = @sqlStr + rtrim(@sqlFrom) -- 查询临时表 得到所需要的数据SELECT @sqlStr = @sqlStr + ' '+'SELECT '+ rtrim(@sqlSelect) +' FROM ' + @tmpTable SELECT @sqlStr = @sqlStr + ' WHERE  RowIndex BETWEEN ' + Convert(char,@start) + ' AND ' + Convert(char,@end)-- 删除临时表SELECT @sqlStr = @sqlStr + ' '+'DROP TABLE '+@tmpTableEXEC (@sqlStr)ENDgo 

读书人网 >asp.net

热点推荐