set @TBName ='aa'
set @KeyField='id'
set @SQL = ''
set @SQL = @SQL + 'declare @sLastValue nvarchar(100)' + char(13)    
set @SQL = @SQL + 'SELECT Top 30 ' 
+ ' @sLastValue=' + @KeyField
+ ' FROM ' + @TBName +  ' ' 
+ ' order by desc '+ char(13)set @SQL = @SQL + 'SELECT Top  10 ' 
+ '* ' 
+ ' FROM ' + @TBName 
                + ' where ' + @KeyField+ '<'+ '@sLastValue '
                + ' order by desc '上面这段代码有两处看不懂:
1. 为什么要用 char(13) ,有什么作用;
2. @sLastValue 是什么东东,在这里有什么作用(我的理解:是自定义关键字,存放30条记录的id字段)。

解决方案 »

  1.   

     char(13) 就是回车,这里也可以用空格
    set   @SQL   =   @SQL   +   'declare   @sLastValue   nvarchar(100)'
    set   @SQL   =   @SQL   +   ' SELECT   Top   30   '   @sLastValue是动态语句里的一个变量,在下面的调用sp_executesql存储过程有说明,你没有贴全你的代码
      

  2.   

    1 你的语句有问题 order  by desc   
    2 char(13)意为回车
      

  3.   

    完整代码如下:CREATE proc proc_sms_page(       proc_sms_page : 存储过程名,
     --定义参数  
     @TBName varchar(100),             --表名
     @PageSize int=10,                 --每页的记录数
     @CurPage int=1,                   --当前要显示的页
     @KeyField nvarchar(100)='ID',     --关键字 ID
     @KeyAscDesc nvarchar(4)='ASC',    -- 比较苻号:DESC为" <" 或  ASC 为" >" 
     @Fields  nvarchar(500)='*',       --查询字段
     @Condition varchar(2500)='',      --where条件
     @Order  nvarchar(200)='',          --排序
     @doCount int=0                     --最取1个参数。  传递过来可能为1
    ) as       --指明存储过程要执行的动作declare @SQL nvarchar(2000)
    if @doCount != 0    --统计记录数
    begin 
    if @Condition !='' 
    set @SQL = 'select count(*) as Total from ' + @TBName + ' where '+@Condition 
    else 
    set @SQL = 'select count(*) as Total from ' + @TBName
    end 
    else begin 
     if @TBName = ''
        begin
            --11:用户定义的与消息关联的严重级别。用户可以使用从 0 到 18 之间的严重级别
            --1: 表示有关错误调用状态的信息从 1 到 127 的任意整数。state 的负值默认为 1
            raiserror('请指定表名!',11,1) 
            return
        end
        
     if @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

     set @SQL = ''
     
     if @CurPage = 1    --当前页是第1页时    
        set @SQL = @SQL + 'SELECT Top ' 
         + cast(@PageSize as nvarchar(20)) + ' '
            + @Fields + ' FROM ' + @TBName + @Condition + ' ' + @Order
     else  begin    --当 当前页不是第1页时
      declare @iTopNum int        --此当前页的起始记录数
      set @iTopNum = @PageSize * (@CurPage - 1)
      
      --在字符串中用 CHAR(13) 和 CHAR(10) 产生一个回车并生成一个新行
      --我的理解: 定义一个变量@sLastValue  
      set @SQL = @SQL + 'declare @sLastValue nvarchar(100)' + char(13) 
      
      set @SQL = @SQL + 'SELECT Top ' 
         +   cast(@iTopNum as nvarchar(20)) 
      + ' @sLastValue=' + @KeyField 
      + ' FROM ' + @TBName + @Condition + ' ' 
      + @Order + char(13)
      
                  declare @Condition2 nvarchar(200)
                  
      if @Condition = ''   -- @Condition 是where条件  一般为空
         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 + @Order
         end 
    end EXECUTE sp_executesql @SQL
     
    GO
      

  4.   

    建议用char(13)+char(10)或char(10)替换char(13)
    Windows系统Enter键=char(13)+char(10)
    UNIX系统Enter键=char(10)老式打字机回车(char(13))=回到行首,加换行(char(10))才会跳到下一空行。