我正在向几个存储过程添加一些验证,并且需要检查某些变量是否不为空(它们在存储过程的早期填充)。
我一直在尝试在 if 语句中添加一个“抛出”,如下所示:
IF (@val is null)
BEGIN
THROW 50001, 'Custom text', 1
END
这会导致“抛出”出现语法错误,因为它在抛出之前在 if 语句中查找其他代码,但我只需要它在 if 语句中执行抛出。
我需要使存储过程尽可能轻,以使其尽可能快地执行。
有没有人有任何想法?
我正在向几个存储过程添加一些验证,并且需要检查某些变量是否不为空(它们在存储过程的早期填充)。
我一直在尝试在 if 语句中添加一个“抛出”,如下所示:
IF (@val is null)
BEGIN
THROW 50001, 'Custom text', 1
END
这会导致“抛出”出现语法错误,因为它在抛出之前在 if 语句中查找其他代码,但我只需要它在 if 语句中执行抛出。
我需要使存储过程尽可能轻,以使其尽可能快地执行。
有没有人有任何想法?
出现语法错误是因为前一个语句尚未终止。其他答案将起作用,但为了这样做,您可以在 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 语言将要求在每条语句后使用分号,所以我的建议是现在就开始养成这个习惯。
如果这是针对 SQL Server 的,智能感知语法高亮不喜欢它,但代码应该可以编译并运行良好。当然,由于它是单个语句,因此您根本不需要BEGIN
...END
块:
IF (@val is null) THROW 50001, 'Custom text', 1
DECLARE @val NVARCHAR(50) = NULL
IF @val is null
RAISERROR('Custom text', 16,16)
用于不同级别的检查