SQL只在if语句中抛出

Edm*_*d G 23 sql sql-server if-statement throw

我正在为一些存储过程添加一些验证,并且需要检查某些变量是否为空(它们在存储过程的早期填充).

我一直试图在if语句中添加一个"throw",如下所示:

IF (@val is null)
BEGIN
    THROW 50001, 'Custom text', 1
END
Run Code Online (Sandbox Code Playgroud)

这会导致"throw"出现语法错误,因为它在throw之前查找if语句中的其他代码,但我只需要它在if语句中执行throw.

我需要保持存储过程尽可能轻,以尽可能快地执行.

有没有人有任何想法?

NRe*_*ngh 42

语法错误显示,因为前一个语句尚未终止.其他答案也可以,但是为了这样做你可以在THROW之前抛出分号,或养成用分号终止所有语句的习惯.

IF (@val is null)
BEGIN
    ;THROW 50001, 'Custom text', 1
END
Run Code Online (Sandbox Code Playgroud)

要么

IF (@val is null)
BEGIN;
    THROW 50001, 'Custom text', 1;
END;
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到:

IF (@val is null)
    THROW 50001, 'Custom text', 1
Run Code Online (Sandbox Code Playgroud)

...也会工作,这是因为SQL Server知道IF语句之后的下一件事总是新的T-SQL语句.

值得注意的是,微软已声明未来的T-SQL语言在每个语句后都需要分号,所以我的建议是现在开始养成习惯.

  • 这应该是答案. (5认同)
  • 这个语法看起来确实很奇怪 BEGIN; 此处的语句结束;为什么终止BEGIN就可以了!? (2认同)