ALTER PROCEDURE sp_ListNews(@n  int)ASEXEC('SELECT TOP '+@n
+' FROM News
ORDER BY AddDate DESC')

解决方案 »

  1.   

    ALTER PROCEDURE sp_ListNews
    @top int
    AS
    declare @s varchar(8000)
    set @s='SELECT TOP '+cast(@top as varchar)+' FROM News ORDER BY AddDate DESC'
    exec(@s)
    go
      

  2.   

    --或者用下面的方法ALTER PROCEDURE sp_ListNews
    @top int
    AS
    SET ROWCOUNT @top
    SELECT * FROM News
    ORDER BY AddDate DESC
    go
      

  3.   

    Transact-SQL 参考  
    SET ROWCOUNT
    使 Microsoft® SQL Server™ 在返回指定的行数之后停止处理查询。 语法
    SET ROWCOUNT { number | @number_var } 参数
    number | @number_var是在停止给定查询之前要处理的行数(整数)。注释
    建议将当前使用 SET ROWCOUNT 的 DELETE、INSERT 和 UPDATE 语句重新编写为使用 TOP 语法。有关更多信息,请参见 DELETE、INSERT 或 UPDATE。对于在远程表和本地及远程分区视图上执行的 INSERT、UPDATE 和 DELETE 语句,忽略 SET ROWCOUNT 选项设置。若要关闭该选项(以便返回所有的行),请将 SET ROWCOUNT 指定为 0。说明  设置 SET ROWCOUNT 选项将使大多数 Transact-SQL 语句在已受指定数目的行影响后停止处理。这包括触发器和 INSERT、UPDATE 及 DELETE 等数据修改语句。ROWCOUNT 选项对动态游标无效,但限制键集的行集和不感知游标。使用该选项时应谨慎,它主要与 SELECT 语句一起使用。
    如果行数的值较小,则 SET ROWCOUNT 替代 SELECT 语句 TOP 关键字。SET ROWCOUNT 的设置是在执行或运行时设置,而不是在分析时设置。权限
    SET ROWCOUNT 权限默认授予所有用户。示例
    SET ROWCOUNT 在指定的行数后停止处理。在下例中,注意有 x 行满足预付款少于或等于 $5,000 的条件;但是,从更新所返回的行数中可以看出并非所有的行都得到处理。ROWCOUNT 影响所有的 Transact-SQL 语句。USE pubs
    GO
    SELECT count(*) AS Cnt
    FROM titles 
    WHERE advance >= 5000
    GO下面是结果集:Cnt       
    ----------- 
    11          (1 row(s) affected)现在,将 ROWCOUNT 设置为 4,并更新预付款等于或大于 $5,000 的所有行。-- SET ROWCOUNT to 4.
    SET ROWCOUNT 4
    GO
    UPDATE titles
    SET advance = 5000
    WHERE advance >= 5000
    GO
    请参见SET©1988-2000 Microsoft Corporation。保留所有权利。
      

  4.   

    總之,如果@top定義為字串的話要用exec解析,定義為int的話,應該用"直接写成top @Num"是可以的.
      

  5.   

    CREATE PROCEDURE sp_ListNews
    @top int =1 --加上默认值会好些
    AS
    SET NOCOUNT ON
    IF @TOP IS NULL
     SELECT @TOP =1
    SET ROWCOUNT @top
    BEGIN
    SELECT * FROM News
    ORDER BY AddDate DESC
    END
    go