【问题标题】:Dynamic SELECT TOP @var In SQL ServerSQL Server 中的动态 SELECT TOP @var
【发布时间】:2010-09-15 14:43:34
【问题描述】:

如何在 SQL Server 中使用动态变量设置要返回的行数?以下是 SQL Server 2005+ 中无效的语法:

DECLARE @count int
SET @count = 20

SELECT TOP @count * FROM SomeTable

【问题讨论】:

  • 您运行的是 SQL 2005 还是 2008?
  • 目前正在运行 SQL Server 2005

标签: sql sql-server-2005


【解决方案1】:
declare @rows int = 10

select top (@rows) *
from Employees
order by 1 desc -- optional to get the last records using the first column of the table

【讨论】:

    【解决方案2】:

    或者你只是把变量放在括号里

    DECLARE @top INT = 10;
    
    SELECT TOP (@Top) *
    FROM <table_name>;
    

    【讨论】:

      【解决方案3】:

      也可以使用动态SQL,用exec命令执行:

      declare @sql  nvarchar(200), @count int
      set @count = 10
      set @sql = N'select top ' + cast(@count as nvarchar(4)) + ' * from table'
      exec (@sql)
      

      【讨论】:

      【解决方案4】:

      语法“select top (@var) ...”仅适用于 SQL SERVER 2005+。对于 SQL 2000,您可以这样做:

      set rowcount @top
      
      select * from sometable
      
      set rowcount 0 
      

      希望对你有帮助

      欧辛。

      (已编辑以将 @@rowcount 替换为 rowcount - 感谢 augustlights)

      【讨论】:

      • 我听说如果你有多列主键,@@RowCount 可能会得到不正确的行号。这是真的吗?
      【解决方案5】:

      在 x0n 的例子中,应该是:

      SET ROWCOUNT @top
      
      SELECT * from sometable
      
      SET ROWCOUNT 0
      

      http://msdn.microsoft.com/en-us/library/ms188774.aspx

      【讨论】:

        【解决方案6】:
        SELECT TOP (@count) * FROM SomeTable
        

        这仅适用于 SQL 2005+

        【讨论】:

        • 我也总是忘记括号。
        • 这太棒了!一直以来我都认为我必须使用动态 sql。
        • 还有谁会通过不添加括号来实现查询中的愚蠢错误?
        • 你拯救了我的一天!我想仅为此将所有内容移至动态查询!
        • 我忘了 * :D
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-17
        • 2011-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-22
        • 2020-01-25
        相关资源
        最近更新 更多