Пользовательские ошибки T-SQL Basic игнорируются в хранимой процедуре - PullRequest
0 голосов
/ 19 ноября 2018

РЕДАКТИРОВАТЬ 3: РЕШЕНИЕ Очевидно, у моего кода были проблемы с блоками BEGIN / END, поскольку ответившие пользователи предложили (спасибо!)

Тем не менее, я не мог заставить вас работать, пока я не нашел этопост и попробовал это, если / else структура: с использованием Switch как логика в T-SQL


EDIT2:
Я написал пару PRINT s в процедуреи значения проходят как раз правильно.Теперь он говорит только «Неверный идентификатор», даже при отправке 200.

220
dsf4
Oct 12 2018 10:10AM
Msg 50000, Level 16, State 1, Procedure p_ValCulture, Line 188
Invalid ID

РЕДАКТИРОВАТЬ: я попытался установить сообщение об ошибке в BEGIN / END;это не сработало.Это код для этой части.

IF @operacion LIKE 'I'
    BEGIN
        IF @id IS NULL OR @id <= 0
            BEGIN
                SELECT @errorDesc = 'Invalid ID'    
                RAISERROR(@errorDesc, 16, 1)
            END

        IF EXISTS(SELECT 1 FROM Production.Culture AS pc WHERE PC.CultureID = @id)
            BEGIN   
                SELECT @errorDesc = 'ID already exists'
                RAISERROR(@errorDesc, 16, 1)
            END
END

Я получу это, если выполню хранимую процедуру

Msg 50000, Level 16, State 1, Procedure p_ValCulture4, Line 183

Ниже этого сообщения есть пробел, значение сообщения об ошибкечто я не смог установить.

Вот параметры, которые я передаю:

GO
EXEC p_ValCulture4 200, 'John', '10-12-2018 10:10:10.000','I'

Я использую SQL Server Management 2014, в Windows 64bit.


Я пытаюсь наверстать упущенное на T-SQL, но я не получил достаточно внимания ... но я полностью застрял: / Я проверил Google, Youtube, SO и т. Д .. и перепробовал много вещей, но ничего не работаети я трачу время, застрявшее на этой части, которое я не могу понять.

У меня есть хранимая процедура, которая при отправке «операции» как «I» (char) выполнит вставку в таблицу,Я использую базу данных AdventureWorks2014 на практике.

Проблема заключается в том, что я хочу отправлять различные сообщения об ошибках, если отправленный идентификатор имеет значение null, или другое, если оно уже существует в таблице и т. Д.код процедуры:

CREATE PROCEDURE p_ValCulture4
   @id INT,
   @name NVARCHAR(50),
   @date DATETIME,
   @operacion CHAR(1)
AS
BEGIN
   print @id
   print @name
   print @date
   SET NOCOUNT ON 
   DECLARE @errorDesc nvarchar(MAX)

   BEGIN TRY

       SELECT @operacion = UPPER(@operacion) 

       IF @operacion = 'I'  /* the Insert option */
          BEGIN
              IF @id IS NULL OR @id <= 0
                  BEGIN
                      SELECT @errorDesc = 'Invalid ID'  
                      RAISERROR(@errorDesc, 16, 1)
                  END

              IF EXISTS(SELECT 1 FROM Production.Culture AS pc WHERE PC.CultureID = @id)
                 BEGIN
                      SELECT @errorDesc = 'ID already exists'
                      RAISERROR(@errorDesc, 16, 1)
                 END

              SELECT @errorDesc = 'ERROR: Insert error'
              INSERT INTO Production.Culture VALUES
        (@id, @name, @date);
              SELECT 'Rows: ' + CONVERT(VARCHAR(10),@@ROWCOUNT)
          END
      END TRY
   BEGIN CATCH
       RAISERROR (@errorDesc,16,1)
   END CATCH
END

Первый IF, если я посылаю id = null, работает нормально, я получаю правильную ошибку;но если я отправлю существующий идентификатор, IF полностью игнорируется.То же самое происходит со вставкой, она работает нормально, но только если в процедуре нет IF.

Я не могу понять, как эти IF - BEGIN / END работают .. и почему это можеттолько читать первый IF, но игнорировать последующие ..

Я пытался поместить все в IF - BEGIN / END, а затем ELSE - BEGIN / END, те же результаты.

У меня естьпопытался установить сообщение об ошибке внутри де IFs, а также снаружи.Кроме того, внутри IFs, но до того, как НАЧАТЬ.Я пытался написать ошибку прямо в RAISERROR, те же результаты.

Если кто-нибудь может помочь мне понять, почему игнорируются IF и логика, лежащая в основе этих IF в T-SQL, было бы очень признательно, очень приятно :)Спасибо!

1 Ответ

0 голосов
/ 19 ноября 2018

Согласованный отступ обязательно поможет вам увидеть проблемы, связанные с вашими парами Начального конца.

Ваш первый тест IF имеет BEGIN в том же горизонтальном положении под ним, но следующий тест IF имеет свой BEGIN с дополнительным отступом.

Если вы сделаете этот тест IF, как первый, в том смысле, что BEGIN & END находятся в одной горизонтальной позиции, это выявит проблемы, подобные ZLK, указанным в приведенном выше комментарии, SELECT @errorDesc = 'Invalid ID'работает вне пары BEGIN END.

...