我正在尝试找出传递给存储过程的参数是否存在于给定的列表中,这样我就可以继续该过程或引发错误。但是,它在默认情况下会引发错误。在这种情况下,我如何知道问题到底出在哪里?
CREATE PROCEDURE [MySchema].[MyProcedure]
(@MyParameter CHAR(10))
AS
IF (@MyParameter <> 'INSERT' OR
@MyParameter <> 'UPDATE' OR
@MyParameter <> 'DELETE')
BEGIN
RAISERROR('Invalid parameter passed', 15, 1);
END;
UPDATE [MyTable]
....
..下面是我是如何执行这段代码的:
EXEC [MySchema].[MyProcedure] @MyParameter = 'UPDATE';我甚至试着把代码改成
IF (LTRIM(RTRIM(@MyParameter)) <> 'INSERT' OR
LTRIM(RTRIM(@MyParameter)) <> 'UPDATE' OR
LTRIM(RTRIM(@MyParameter)) <> 'DELETE')但这并不管用。
环境: Microsoft SQL Azure (RTM) - 12.0.2000.8 Apr 9 2020 16:39:55版权所有(C) 2019 Microsoft Corporation
发布于 2020-05-27 04:03:59
这是因为您正在使用逻辑OR运算符。如果任何一个条件为真,则OR返回true,因此当您输入UPDATE时,其他两个条件也为true -因为它不是INSERT或DELETE。将OR更改为AND,您的逻辑就会正常工作。但更好的做法是使用NOT IN,如下所示:
CREATE PROCEDURE [MySchema].[MyProcedure]
(
@MyParameter CHAR(10)
)
AS
BEGIN
SET NOCOUNT ON;
IF @MyParameter NOT IN ('INSERT', 'UPDATE', 'DELETE')
BEGIN
--RAISERROR('Invalid Parameter passed', 15, 1);
THROW 51000, 'Invalid Parameter passed', 1;
END;
UPDATE [MyTable]
...
END注意:建议在raiserror上使用throw。
https://stackoverflow.com/questions/62030177
复制相似问题