如今面临如下问题:存储过程如下:create proc  sp_GetTopThing
@count int,
@size intasselect top @size * from message where id not in(select top @count id from message order by(id) desc) order by(id) desc
当执行的时候会出问题,该怎么解决啊..也就是 @size就是我们的查询的前N条数据,@count表示已经查询过的message表中的数据...解决此问题者给高分.....越详细越好...

解决方案 »

  1.   

    create proc  sp_GetTopThing
    @count int,
    @size intasselect top (@size) * from message where id not in(select top (@count) id from message order by(id) desc) order by(id) desc 
      

  2.   

    create proc  sp_GetTopThing
    @count int,
    @size intas
    begin
    declare @sql varchar(8000)
    set @sql='
    select top '+ltrim(@size)+' * from message where id not in(select top '
    +ltrim(@count)+' id from message order by(id) desc) order by(id) desc'
    exec (@sql)
    end
     
      

  3.   


    create proc  sp_GetTopThing 
    @count int, 
    @size int 
    as declare @sql varchar(8000)set @sql='select top '+ltrim(@size)+' * from message where id not in(select top '+ltrim(@count)+' id from message order by(id) desc) order by(id) desc'exec (@sql)go
      

  4.   

    create proc  sp_GetTopThing
    @count int,
    @size intas
    begin
    declare @sql varchar(8000)
    set @sql='
    select 
      top '+ltrim(@size)+' * 
    from 
      message 
    where 
      id 
    not in
      (select top '+ltrim(@count)+' id from message order by(id) desc) order by(id) desc'
    exec (@sql)
    end
      

  5.   

    看看我以前的解决方案,除了上面介绍的方法,还有一种http://blog.csdn.net/downmoon/archive/2006/04/12/660557.aspx

    http://www.cnblogs.com/downmoon/archive/2007/12/29/1019686.html
      

  6.   

    create proc  sp_GetTopThing 
    @count int, 
    @size int 
    as declare @sql varchar(8000)set @sql='select top '+ltrim(@size)+' * from message where id not in(select top '+ltrim(@count)+' id from message order by(id) desc) order by(id) desc'exec (@sql)go
      

  7.   


    在2000中用这种方法倒是很省事,学了一招,不过要记得set rowcount 0
      

  8.   

    这个得用动态语句吧。
    create proc  sp_GetTopThing
    @count int,
    @size intas
    begin
    declare @sql varchar(8000)
    set @sql='
    select top '+ltrim(@size)+' * from message where id not in(select top '
        +ltrim(@count)+' id from message order by(id) desc) order by(id) desc'
    exec (@sql)
    end
      

  9.   

    sql2005的top支持用变量,sql2000不支持,只能拼字符串用exec执行
      

  10.   


    2000不支持TOP带变量吧
      

  11.   

    create proc  sp_GetTopThing 
    @count int, 
    @size int as select top (@size) * from message where id not in(select top (@count) id from message order by(id) desc) order by(id) desc 加上括号就可以了了
      

  12.   

    先MARK,然后自己写一下把过程发上来
      

  13.   

    create procedure sp_GetTopThing
    (
    @count int, 
    @size int 
    )
    as
    begin
    declare @sql varchar(8000)
    set @sql='select top '+cast(@size as varchar(20))+' * from message '
    set @sql=' where [id] not in (select top '+cast(@count as varchar(20))+' [id] from message order by([id]) desc) order by(id) desc'

    exec(@sql)
    end
      

  14.   

    --使用动态sqlcreate proc  sp_GetTopThing 
    @count int, 
    @size int as 
    declare @sql varchar(200)@sql='select top '+convert(varchar(20),@size)+' * from message where id not in(select top '+convert(varchar(20),@count)+' id from message order by(id) desc) order by(id) desc '
    exec(@sql)
      

  15.   


    /*---------------------------------------
    瘦狼阿亮 | 钱不是问题,问题是没钱!我乐于享受学习的过程
    ---------------------------------------*/DECLARE @SQL varchar(8000)--测试环境中声明一下@size和@count变量
    DECLARE @size int
    DECLARE @count int--设置参数变量值
    SET @size=6
    SET @count=10--用连接字符串的方式生成SQL语句,并将SQL语句放置到@SQL变量中
    SET @SQL='select top '+CAST(@size AS varchar(10))+' * from message where id not in(select top '
    +CAST(@count AS varchar(10))+' id from message order by(id) desc) order by(id) desc'--为保证语句能够正常运行,首先先打印出生成的SQL语句,用于验证是否符合要求
    PRINT (@SQL)/*执行结果:
    以下是生成的语句
    select top 6 * from message where id not in(select top 10 id from message order by(id) desc) order by(id) desc
    */--执行生成的SQL语句(如果经过检查SQL语句没有问题,就可以把上面的print (@sql)注释掉,直接执行查询即可)
    --EXEC (@SQL)
      

  16.   

    --最后再将上面的语句放置到存储过程中
    CREATE PROC sp_GetTopThing 
    @count INT,@size INT 
    AS 
    BEGION
    DECLARE @SQL varchar(8000) SET @SQL='select top '+CAST(@size AS varchar(10))+' * from message where id not in(select top '
    +CAST(@count AS varchar(10))+' id from message order by(id) desc) order by(id) desc' EXEC (@SQL)
    END
      

  17.   

    在这里LZ需要注意的是,如果在生成SQL语句中需要使用到 ’标识符的如下面的语句:DECLARE @SQL varchar(8000)DECLARE @size int
    DECLARE @count int
    DECLARE @TEST VARCHAR(100)SET @size=6
    SET @count=10
    SET @TEST='TEST'SET @SQL='select top '+CAST(@size AS varchar(10))+' * from message where id not in(select top '
    +CAST(@count AS varchar(10))+' id from message WHERE NAME='''+@TEST+''' order by(id) desc) order by(id) desc'PRINT @SQL/*执行结果:
    select top 6 * from message where id not in(select top 10 id from message WHERE NAME='TEST' order by(id) desc) order by(id) desc注意这里,语句中是这样写的:WHERE NAME='''+@TEST+'''
    而执行的结果是:WHERE NAME='TEST'在 'WHERE …………'字符串中要显示一个 ' 
    必须写成 '',如果只有一个',结果就是错误的*/至于这个语句中所使用到的PRINT和EXEC,楼主可以看看联机丛书,里面有详细的描述*********************************
    PRINT
    将用户定义的消息返回客户端。语法
    PRINT 'any ASCII text' | @local_variable | @@FUNCTION | string_expr参数
    'any ASCII text'一个文本字符串。@local_variable任意有效的字符数据类型变量。@local_variable 必须是 char 或 varchar,或者能够隐式转换为这些数据类型。@@FUNCTION是返回字符串结果的函数。@@FUNCTION 必须是 char 或 varchar,或者能够隐式转换为这些数据类型。string_expr是返回字符串的表达式。可包含串联的字面值和变量。消息字符串最长可达 8,000 个字符,超过 8,000 个的任何字符均被截断。注释
    若要打印用户定义的错误信息(该消息中包含可由 @@ERROR 返回的错误号),请使用 RAISERROR 而不要使用 PRINT。示例
    A. 有条件地执行打印 (IF EXISTS)
    本示例使用 PRINT 语句有条件地返回消息。IF EXISTS (SELECT zip FROM authors WHERE zip = '94705')
       PRINT 'Berkeley author'B. 生成并显示字符串
    本示例将 GETDATE 函数的结果转换为 varchar 数据类型,并将其与 PRINT 要返回的文本进行串联。PRINT 'This message was printed on ' + 
       RTRIM(CONVERT(varchar(30), GETDATE())) + '.'*********************************EXECUTE
    执行标量值的用户定义函数、系统过程、用户定义存储过程或扩展存储过程。同时支持 Transact-SQL 批处理内的字符串的执行 若要唤醒调用函数,请使用 EXECUTE stored_procedure 中描述的语法。语法
    执行存储过程:[ [ EXEC [ UTE ] ]
        { 
            [ @return_status = ]
                { procedure_name [ ;number ] | @procedure_name_var
        } 
        [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ]
            [ ,...n ] 
    [ WITH RECOMPILE ] 执行字符串:EXEC [ UTE ] ( { @string_variable | [ N ] 'tsql_string' } [ + ...n ] )参数
    @return_status是一个可选的整型变量,保存存储过程的返回状态。这个变量在用于 EXECUTE 语句前,必须在批处理、存储过程或函数中声明过。*********************************