【问题标题】:Incorrect syntax near 'THROW''THROW' 附近的语法不正确
【发布时间】:2016-05-02 09:14:48
【问题描述】:
IF @SQL IS NOT NULL
BEGIN
    BEGIN TRY 
        EXEC sp_executesql @SQL
        PRINT 'SUCCESS: ' + @SQL
    END TRY 
    BEGIN CATCH
        SET @ErrorMessage = 
                    N'Error dropping constraint' + @CRLF
                    + 'Table ' + @TableName + @CRLF
                    + 'Script: ' + @SQL + @CRLF
                    + 'Error message: ' + ERROR_MESSAGE() + @CRLF
        THROW  50100, @ErrorMessage, 1;
    END CATCH
END

CATCH 执行时,出现以下错误:

消息 102,第 15 级,状态 1,第 257 行
'THROW' 附近的语法不正确。

PRINT @ErrorMessage 替换THROW 有效。

用文字字符串替换 @ErrorMessage 变量是可行的。

然而,根据文档,THROW 应该能够接受一个变量。不知道该怎么做。

【问题讨论】:

    标签: sql-server tsql sql-server-2014


    【解决方案1】:

    来自MSDN

    THROW 语句之前的语句必须后跟分号 (;) 语句终止符。

    【讨论】:

    • 我想从现在开始我会拼写它;THROW。谢谢!
    • 好计划。当某些关键字有特殊规则而不是其他关键字时,这真的很烦人。
    • 大声笑...微软处于最佳状态。如果他们想像 Oracle 那样实现分号,那么应该有一些一致性!
    【解决方案2】:

    来自Documentation on THROW, Remarks

    THROW 语句之前的语句必须后跟分号 (;) 语句终止符。

    始终以分号结尾是一个好习惯。

    【讨论】:

    • “总是用分号结束你的陈述是一个好习惯。”当然可以,但是考虑到if @@rowcount = 0 begin throw ###, '', # end,必须用分号终止begin 真的很奇怪
    • @Timbo BEGIN 不是声明。 BEGINEND是流控制语言关键字。
    • 这就是为什么我觉得奇怪的是构建希望 begin 以分号结束。
    • @Timbo 确实很奇怪。我猜没有什么是完美的;)
    • 同意@Timbo,我更喜欢写 ;THROW 当 throw 换行时
    【解决方案3】:

    我只是遇到了同样的错误,但原因完全不同。我使用的机器有点旧,但有 SSMS 2012(引入了THROW 的版本)。但是实际的 SQL 服务器是 10.5(即 2008 R2;请参阅 https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-compatibility-level),因此该命令无效。

    希望不会有太多十年前的设置实例,但请仔细检查您是否得到了这个,并确定您的语法是正确的!

    【讨论】:

    • 请注意,忘记分号并在无参数过程调用后使用它会通过解析(在 2012 之前的版本中),而是在运行时抛出错误 8146,并显示消息“Procedure ParameterlessProcedure has没有提供参数和参数。”
    猜你喜欢
    • 1970-01-01
    • 2015-12-12
    • 2013-12-16
    • 1970-01-01
    • 2018-08-14
    • 2011-03-11
    • 2014-02-16
    • 2017-01-11
    • 2020-02-06
    相关资源
    最近更新 更多