【问题标题】:Syntax error when assign a variable for top clause in sql server在 sql server 中为 top 子句分配变量时出现语法错误
【发布时间】:2014-12-16 11:01:23
【问题描述】:

我需要从表中获取前 10、前 100 条这样的记录。但我需要在变量中为 top 子句分配值,例如 10 或 100。

但是当我像下面这样给出时,它给出了一个语法错误“'@numberofRecords'附近的语法不正确。”。

DECLARE @numberofRecords INT
SELECT @numberofRecords = ConfigValue FROM tblConfigItems (NOLOCK) WHERE configName = 'TopRecords'

SELECT TOP @numberofRecords [ID],TypeID, MessageType, operationDate
FROM NotifyTbl (NOLOCK)
wHERE STATUS IN ('1', '2')

如何做到这一点?

【问题讨论】:

    标签: sql-server stored-procedures declare clause


    【解决方案1】:

    避免动态 SQL。就用这个吧:

    SELECT TOP (@numberofRecords) [ID],TypeID, MessageType, operationDate
    FROM NotifyTbl (NOLOCK)
    wHERE STATUS IN ('1', '2')
    

    您至少需要 SQL 2005 才能使其正常工作。是的 () 可以解决问题。

    【讨论】:

    • 我在 SQL Server 2008 R2 中试过这个,它不起作用。
    • @thevan 我在 SQL Server 2008 R2 中试过这个,它可以工作。也许您可以提供一些技术信息,而不仅仅是“不工作”。有什么错误信息吗?
    • 我在给出解决方案之前尝试过。也许数据库处于兼容模式 SQL 2000 中?
    • 它给出了诸如“'(''附近的语法不正确”之类的错误。&我也在使用SQL Server 2008 R2。
    • 数据库的兼容模式怎么样?只是因为,即使它有效,我认为在解决动态 SQL 问题时不太优雅并且更困难。
    【解决方案2】:

    你可以使用动态 SQL

    exec('SELECT TOP ' + @numberofRecords + ' [ID],TypeID, MessageType, operationDate
          FROM NotifyTbl (NOLOCK)
          wHERE STATUS IN (''1'', ''2'')')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-12
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-19
      • 2012-09-28
      相关资源
      最近更新 更多