我用了如下存储过程,出现排序问题我在在表中加了一个排序字段 upfile ,int 类型,
现在sql排序是这样的 orderby upfile desc ,id desc在第一页,,出现的记录,,在翻到第二页也会出现,怎么回事存储过程如下 CREATE proc sp_PublicTurnPage(
@TBName nvarchar(2000)='',--表名,如 pinyin
@PageSize int=10,--每页的记录数,默认为 10
@CurPage int=1,--表示当前页 1@RowCount int =0 Output,--表示当前页 1@KeyField nvarchar(200)='ID',--关键字段名,默认为 ID,该字段要求是表中的索引 或 无重复和不为空的字段
@KeyAscDesc nvarchar(4)='',--关键字的升、降序,默认为升序 ASC , 降序为 DESC
@Fields nvarchar(2000)='ID',--所选择的列名,默认为全选
@Condition nvarchar(3000)='',--where 条件,默认为空
@OrderBy nvarchar(200)=''--排序条件,默认为空)asif @TBName = ''
   begin
       raiserror('请指定表名!',11,1)
       return
   endif @PageSize <=0 or @CurPage <0 
   begin
       raiserror('当前页数和每页的记录数都必须大于零!',11,1)
       return
   end
if @KeyAscDesc = 'DESC'
set @KeyAscDesc = '<'
else
set @KeyAscDesc = '>'
if @Condition <> ''
set @Condition = ' where ' + @Condition
declare @SQL nvarchar(2000)
declare @SQL2 nvarchar(2000)
set @SQL = ''
if @CurPage = 1
set @SQL = @SQL + 'SELECT Top ' + ' ' + cast(@PageSize as nvarchar(20)) + ' ' + @Fields  + ' ' +  ' FROM '  + ' ' +  @TBName  + ' ' + @Condition + ' ' + @OrderByelse
   begin
declare @iTopNum int
set @iTopNum = @PageSize * (@CurPage - 1)
set @SQL = @SQL + 'declare @sLastValue nvarchar(100)' + char(13)
set @SQL = @SQL + 'SELECT Top ' + cast(@iTopNum as nvarchar(20)) + ' @sLastValue=' + @KeyField + ' FROM ' + @TBName + @Condition + ' ' + @OrderBy+ char(13)declare @Condition2 nvarchar(200)
if @Condition = ''
   set @Condition2 = ' where ' + @KeyField + @KeyAscDesc + '@sLastValue '
else
   set @Condition2 = ' and ' + @KeyField + @KeyAscDesc + '@sLastValue '
set @SQL = @SQL + 'SELECT Top ' + cast(@PageSize as nvarchar(20)) + ' ' + @Fields + ' FROM ' + @TBName + @Condition + 
@Condition2 + @OrderBy
   end
declare @RowCount2  nvarchar (300)set @RowCount2 ='SELECT @RowCount= COUNT (ID)  From '  + @TBName +  @Condition EXECUTE sp_executesql @RowCount2,N'@RowCount int out',@RowCount outEXECUTE sp_executesql @SQL
GO
 
已上网 取消 普通链接 歌谷搜索 / 13  2007-02-28 修改 删除 
 
已上网 取消 普通链接 百度搜索 / 12  2007-02-28 修改 删除 
 
已上网 取消 普通链接 网易搜索 / 11  2007-03-05 修改 删除 
 
已上网 取消 普通链接 天网搜索 / 10  2007-03-05 修改 删除 
 
已上网 取消 普通链接 雅虎搜索 / 9  2007-03-05 修改 删除 
 
已上网 取消 普通链接 搜搜网 / 7  2007-03-05 修改 删除 
 
已上网 取消 合作网站 白领创业项目加盟网 / 4  2007-04-11 修改 删除 
 
已上网 取消 普通链接 搜狗网 / 3  
 在第二页同样会出现以上记录,,然后才是不重复的记录现在应该如何改成,,加了排序字段存储过程就不能用了吗 

解决方案 »

  1.   

    create PROCEDURE dbo.GetPagingData 
        ( 
            @tablename varchar(100),--表名或视图表 
            @fieldlist varchar(4000)='*',--欲选择字段列表 
            @orderfield varchar(100),--排序字段 
            @keyfield varchar(100),--主键 
            @pageindex int,--页号,从0开始 
            @pagesize int=20,--页尺寸 
            @strwhere varchar(4000),--条件 
            @ordertype bit=1--排序,1,降序,0,升序 
        ) 
    AS 
    /**//* 
    名称:GetPagingRecord 
    作用:按任意字段进行排序分页 
    作者:菩提树(MARK MA) 
    时间:2004-12-14 
    声明:此代码你可以无偿使用及转载,但在转载时,请勿移称本文字声明 
    */ 
        SET NOCOUNT ON 
        declare @sqlstr varchar(6000) 
        --处理SQL中危险字符,并且将条件处理成易嵌入的形式     
        set @sqlstr='declare @Rcount int;' 
        set @sqlstr=@sqlstr+'set @rcount=(select count('+@keyfield+') from '+@tablename+' where '+@strWhere+');'     
        set @strwhere=replace(@strwhere,'''','''''') 
        set @strwhere=replace(@strwhere,'--','') 
        set @strwhere=replace(@strwhere,';','') 
        set @sqlstr=@sqlstr+'declare @Rnum int;' 
        set @sqlstr=@sqlstr+'set @rnum=@rcount-'+cast(@pagesize as varchar)+'*'+cast(@pageindex as varchar)+';' 
        set @sqlstr=@sqlstr+'declare @sqlstr varchar(6000);' 
        if @ordertype=1 
        begin 
        set @sqlstr=@sqlstr+'set @sqlstr=''select top '+cast(@Pagesize as varchar)+' '+@fieldlist+' from (select top 100  
     
    percent * from  (select top  ''+cast(@rnum as varchar)+'' * from '+@tablename+' where '+@strwhere+'  
     
    order by '+@orderfield+' asc) as b order by paymoney desc) as a order by '+@orderfield+' desc '';' 
        end 
        else 
        begin 
        set @sqlstr=@sqlstr+'set @sqlstr=''select top '+cast(@Pagesize as varchar)+' '+@fieldlist+' from (select top 100  
     
    percent * from  (select top  ''+cast(@rnum as varchar)+'' * from '+@tablename+' where '+@strwhere+'  
     
    order by '+@orderfield+' desc) as b order by paymoney asc) as a order by '+@orderfield+' asc '';' 
        end 
        set @sqlstr=@sqlstr+'if @Rcount>0 begin execute(@sqlstr) end'     
        --print @sqlstr 
        execute(@sqlstr)
      

  2.   

    1。
    先在查询分析器里面运行下看看EXEC sp_PublicTurnPage 表名, 10, 1
    2。
    强烈建议用户储存过程不要以 sp 开头, 会被sql引擎当作系统存储过程优先搜索, 导致不可预期的错误
      

  3.   

    EXEC sp_PublicTurnPage 表名, 10, 1
    这句有什么用啊
    能够执行的
      

  4.   

    sendling(心随我动) ( )这个存储过程,不能返回记录总数吧?
      

  5.   

    用了你的,,在 查询分析器中,,执行
    报错
    过程 'GetPagingData' 需要参数 '@keyfield',但未提供该参数。
      

  6.   

    肯定是因为你@KeyField 出现了重复记录如果你用递增的 就没有问题了只是这样不能满足特殊的按时间排序的 需求