【问题标题】:EXECUTESQL error执行SQL错误
【发布时间】:2012-02-23 20:15:08
【问题描述】:

这是我试图在 SQL Server 上执行的以下代码。

DECLARE @string NVARCHAR(MAX) = '
    CREATE PROC [dbo].[Trend]
    @slsID NVARCHAR(20)
    AS
    BEGIN
    SET NOCOUNT ON
    DECLARE @BeginningRange varchar(20),
    @EndingRange varchar(20)
    SET @EndingRange = ''12*13''
    SET @BeginningRange = ''12*02''
    ;WITH CTE1 AS(
             SELECT 
             dbo.Field1,dbo.Field2,dbo.Field3
             FROM dbo.Table1 join dbo.Table2 where...conditions
             weekNum BETWEEN (@BeginningRange) AND (@EndingRange)
                 )
    SELECT * FROM CTE1 
    UNPIVOT
      ( numbers for type in (Field1, Field2, Field3, Field4)
      ) as p PIVOT
      (
      Sum(numbers) for
      WeekNum in ([12*02],[12*03],[12*04],[12*05],[12*06],[12*07],[12*08],[12*09],[12*10],                                                         [12*11],[12*12],[12*13])
      ) as q
      END
'
    EXECUTE SP_EXECUTESQL @STRING

当我尝试运行它时,它会出错说

“关键字'as'附近的语法不正确”

我取出这段代码并单独执行它,它没有出错。我在这里遗漏了什么吗?

【问题讨论】:

  • 您正在运行的代码中是否还有...conditions,或者您是否更改了这些代码以便在此处发布?此外,如果您希望 @EndingRange 被评估为 12*13,则不应将其放在引号中。
  • 我已经考虑了报价。这是我尝试运行的直接复制粘贴,是的,为了发布而故意设置了...条件。
  • 为什么不只是运行代码?我看不出它为什么需要动态 SQL。

标签: sql-server-2008 sp-executesql


【解决方案1】:

看起来在过程的参数周围缺少括号。

您可以使用的一个技巧是打印出 sql 语句,然后尝试运行它 - 错误消息可能会为您提供更多信息

print @STRING

【讨论】:

  • 我已经这样做了,但我找不到任何可能遗漏括号的地方。否则,如果没有 SP_EXECUTESQL,这根本不会执行
  • 参数列表不需要括号。
  • 哦 - 我总是使用括号 - 我想我把编码标准误认为是语法要求 :)
  • 当您在没有 SP_EXECUTESQL 的情况下运行文本时,它会为您提供错误的行号吗?
  • 就像我说的,当我运行没有单引号和 SP_EXECUTESQL 的过程时,它不会出错并成功完成。只有当我尝试通过 EXECUTESQL 创建 proc 时,它才会出错。
【解决方案2】:

PIVOT 和 UNPIVOT 子句都需要两个右括号。

UNPIVOT (... FOR ... IN (...) ) AS ...

PIVOT (... FOR ... IN (...) ) AS ...

【讨论】:

  • 我已经更新了我的答案以显示需要关闭段落的两个地方。
  • 我添加了关闭参数,现在它在不同的行上给了我一个错误。我会尽量调试它。
【解决方案3】:
where...conditions 

这不会通过语法检查。如果您已删除实际条件,则可能这就是您的错误所在。并且:

dbo.Table1 join dbo.Table2 

没有 ON 子句

我通过对 print @string 的结果进行语法检查看到了这两种情况,这是您发现问题应该采取的第一步。我仍然说,根据您给我们的内容,根本没有理由使用动态 SQl,如果您不需要动态 SQL,则使用动态 SQL 是一种不好的做法。

【讨论】:

    猜你喜欢
    • 2015-07-08
    • 2023-03-04
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多