SQL只在if语句中抛出

时间:2013-08-05 08:00:53

标签: sql sql-server if-statement throw

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

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

IF (@val is null)
BEGIN
    THROW 50001, 'Custom text', 1
END

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

我需要尽可能保持存储过程尽可能快地执行。

有没有人有任何想法?

3 个答案:

答案 0 :(得分:37)

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

IF (@val is null)
BEGIN
    ;THROW 50001, 'Custom text', 1
END

IF (@val is null)
BEGIN;
    THROW 50001, 'Custom text', 1;
END;

您可能已经注意到:

IF (@val is null)
    THROW 50001, 'Custom text', 1

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

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

答案 1 :(得分:1)

DECLARE @val NVARCHAR(50) = NULL
IF @val is null

    RAISERROR('Custom text', 16,16)

不同级别 检查

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

答案 2 :(得分:0)

如果这是针对SQL Server的,则intellisense语法高亮显示器不喜欢它,但代码应该编译并运行正常。当然,由于它是单个语句,您根本不需要BEGIN ... END块:

IF (@val is null) THROW 50001, 'Custom text', 1