37

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

我一直在尝试在 if 语句中添加一个“抛出”,如下所示:

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

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

我需要使存储过程尽可能轻,以使其尽可能快地执行。

有没有人有任何想法?

4

3 回答 3

65

出现语法错误是因为前一个语句尚未终止。其他答案将起作用,但为了这样做,您可以在 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 语言将要求在每条语句后使用分号,所以我的建议是现在就开始养成这个习惯。

于 2015-06-13T20:24:51.190 回答
1

如果这是针对 SQL Server 的,智能感知语法高亮不喜欢它,但代码应该可以编译并运行良好。当然,由于它是单个语句,因此您根本不需要BEGIN...END块:

IF (@val is null) THROW 50001, 'Custom text', 1
于 2013-08-05T08:19:14.397 回答
0
DECLARE @val NVARCHAR(50) = NULL
IF @val is null

    RAISERROR('Custom text', 16,16)

用于不同级别的检查

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

于 2013-08-05T08:36:29.390 回答