那位有好用分页存储过程,且能支持复杂查询,我在网上找的都不支持复杂查询,主要是条件中含有多个字段和带or的条件,网上找的大多是第一页正确,以后每页都是相同的,不知那位有没好的!

解决方案 »

  1.   

    新鲜出炉的分页存储过程(SQL Server 2005下的):/*-----------------------------------------------------------------------------------
    * 通用分页存储过程,支持指定查询字段、指定表格或视图、指定排序字段、
    * 指定查询条件等的简单查询

    * 使用了SQL Server 2005的Row_Number()函数进行的快速分页查询

    * 参数说明:
    * -----------------------------------------------------------------------------------
    * @PageSize int 分页的每页条目大小
    * @PageNo int 当前页码数(最小为1)
    * @TableName varchar(200) 要查询的表格名称或者视图名称
    * @Fields varchar(1000) 查询的字段,可以写成:'*',或者'id,name,...'
    * @Condition varchar(1000) 查询的条件,不包含关键字Where,可以写成:
    *                         ' id>202 and len(name)>5 '
    * @OrderCondition varchar(500) 排序条件,不包含关键字 Order By ,可以写成:
    *                         ' id desc, name asc '
    * @TotalCount int 符合条件的所有条目数量,是返回参数
    ------------------------------------------------------------------------------------*/
    CREATE Procedure [dbo].[sp_common_cuspage2]
    (
    @PageSize int,
    @PageNo int,
    @TableName nvarchar(200),
    @Fields nvarchar(1000),
    @Condition nvarchar(1000),
    @OrderCondition nvarchar(500),
    @TotalCount int out
    )
    AS
    Begin
    declare @sqlCount nvarchar(2000)
    declare @execSql nvarchar(2000) --先查询符合条件的总条目数
    SET @sqlCount = N'select @total = count(*) from ' + @TableName
    IF(len(@Condition)>0)
    SET @sqlCount = @sqlCount + N' where '+@Condition
    --print @sqlCount
    exec sp_executesql @sqlCount, N' @total int output ', @TotalCount output declare @begin int
    declare @end int
    IF(@PageNo<1) SET @PageNo = 1 set @begin = @PageSize * (@PageNo-1)
    set @end = @PageSize * @PageNo +1 --分页查询
    SET @execSql = N'SELECT * FROM ('
    SET @execSql = @execSql + N'SELECT Row_Number() OVER(ORDER BY '+@OrderCondition+N') as RowNumber,'+@Fields+N' FROM '+ @TableName
    IF(len(@Condition)>0)
    SET @execSql = @execSql + ' WHERE '+@Condition
    SET @execSql = @execSql + N') G0 '
    SET @execSql = @execSql + N' WHERE RowNumber>'+CAST(@begin as nvarchar) + N' AND RowNumber<'+CAST(@end as nvarchar)
    --print @execSql
    exec(@execSql)
    End
    GO