我用数据库通用分页
先贴代码
Create PROCEDURE [dbo].[pagination]
 @tblName varchar(255), -- 表名 
 @strGetFields varchar(1000) = '*', -- 需要返回的列 
 @fldName varchar(255)='', -- 排序的字段名 
 @PageSize int = 10, -- 页尺寸 
 @PageIndex int = 1, -- 页码 
 @doCount bit = 0, -- 返回记录总数, 非 0 值则返回 
 @OrderType bit = 0, -- 设置排序类型, 非 0 值则降序 
 @strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where) 
AS 
declare @strSQL varchar(5000) -- 主语句 
declare @strTmp varchar(110) -- 临时变量 
declare @strOrder varchar(400) -- 排序类型 
if @doCount != 0 
 begin 
  if @strWhere !='' 
   set @strSQL = "select count(*) as Total from [" + @tblName + "] where "+@strWhere 
  else 
   set @strSQL = "select count(*) as Total from [" + @tblName + "]" 
 end 
else 
 begin 
  if @OrderType != 0 
   begin 
    set @strTmp = "<(select min" 
    set @strOrder = " order by [" + @fldName +"] desc" 
   end 
  else 
   begin 
    set @strTmp = ">(select max" 
    set @strOrder = " order by [" + @fldName +"] asc" 
   end 
   if @PageIndex = 1 
    begin 
     if @strWhere != '' 
      set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from [" + @tblName + "] where " + @strWhere + " " + @strOrder 
     else 
      set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["+ @tblName + "] "+ @strOrder 
    end 
   else 
    begin 
     set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from [" 
      + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["+ @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"+ @strOrder 
      if @strWhere != '' 
     set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from [" 
      + @tblName + "] where [" + @fldName + "]" + @strTmp + "([" 
      + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " [" 
      + @fldName + "] from [" + @tblName + "] where " + @strWhere + " " 
      + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder 
 end 
end 
exec (@strSQL)
GO
然后查询的时候
exec pagination
    @tblName="cheng",       -- 表名
    @strGetFields="*",
    @fldName="id",       -- 主键字段名
    @PageSize=1,           -- 页尺寸
    @PageIndex=2,            -- 页码
    @doCount=0,            -- 返回记录总数, 非 0 值则返回
    @OrderType=1,            -- 设置排序类型, 非 0 值则降序
    @strWhere= 'aid=53' -- 查询条件 (注意: 不要加 where)
现在问题就出来了
如果fldname弄成主键,比如ID或者添加时间,就可以正常显示,然后排序的话要根据推荐什么的来排序,但是有时候推荐全是0,这样排序第二页就什么也不显示,怎么调整才行?
比如这种格式:id    tj(推荐)  城市
1     0           西安
2     0           北京这样就不显示第二页了。怎么弄,求教啊。。

解决方案 »

  1.   

    现在就是不能用ID来排序,要用tj来排序。怎么解决
      

  2.   

    begin 
      if @OrderType != 0 
       begin 
        set @strTmp = "<(select min" 
        set @strOrder = " order by [" + @fldName +"] desc" 
       end 
      else 这改改。。  你懂的
      

  3.   

    。这怎么改啊,改了半天没改出来,本来对sql就不太懂,郁闷死了
      

  4.   

      if @OrderType != 0 
       begin 
        set @strTmp = "<=(select min" 
        set @strOrder = " order by [" + @fldName +"] desc" 
       end 
      else 
       begin 
        set @strTmp = ">=(select max" 
        set @strOrder = " order by [" + @fldName +"] asc" 
       end 不过推荐是0的话第二页应该还会出现的。
      

  5.   

      else 
       begin 
        set @strTmp = ">=(select max" 
        set @strOrder = " order by [" + @fldName +"] asc" 
       end 
    这句没问题,就是 type=1 的时候,排序才有错误
      

  6.   

    没人知道怎么改吗,大概的错误我知道,就是如果主键都是0的话,select min 就获取的是0,然后条件是
    >0 就查询不到了,这个应该怎么改才行啊、、真郁闷死了。
      

  7.   

    一直在用if exists  (select * from  Sysobjects  where  name like  'P_viewPage_A')
    drop Proc   P_viewPage_A
    go
    create PROC P_viewPage_A
    /*
    高效通用分页存储过程(双向检索)
    敬告:适用于单一主键或存在唯一值列的表或视图
    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 ' + @TableName + @new_where1
    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 TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
    + @TableName + @new_where1 + @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
    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
    EXEC(@Sql)
    http://shop64853649.taobao.com/http://img02.taobaocdn.com/bao/uploaded/i2/T1ss8.XkVEXXa1PtUZ_031744.jpg_160x160.jpg