Проверить, существует ли переданный параметр хранимой процедуре в списке? - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь определить, существует ли параметр, переданный хранимой процедуре, в данном списке, чтобы я мог продолжить процесс или вызвать ошибку. Однако по умолчанию это вызывает ошибку. Как мне узнать, в чем именно проблема в этом случае?

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 9 апреля 2020 г. 16:39:55 Авторские права (C) Корпорация Microsoft, 2019 г.

1 Ответ

3 голосов
/ 26 мая 2020

Это потому, что вы используете логический оператор OR. OR возвращает истину, если какое-либо одно условие истинно, поэтому, когда вы вводите UPDATE, другие 2 условия истинны - потому что это не INSERT или DELETE. Измените OR на AND и ваш logi c заработает. Но еще лучше использовать 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

ПРИМЕЧАНИЕ: рекомендуется использовать throw вместо raiserror.

...