Почему это не ловит ошибку в хранимой процедуре? - PullRequest
0 голосов
/ 21 апреля 2019

SQL Server 2014 (v12.0.5546) - у меня есть «основная» хранимая процедура, из которой я запускаю кучу других. Если произойдет ошибка, я хочу напечатать строку, в которой будет указано:

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

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

К вашему сведению, мне не нужно, чтобы он прекращал работу, если обнаружится ошибка, мне просто нужно выложить сообщение об ошибке, чтобы я знал, где произошла ошибка. Это будет расти до 20-30 хранимых процедур к тому времени, когда все сказано и сделано.

Вот главная хранимая процедура:

ALTER PROCEDURE [dbo].[Master_CreateLoadTables]
AS
    DECLARE @retval INT

    -- Builds all tables required for the stored procedures
    EXEC @retval = [BuildTables]

    IF (@retval) = 0
    BEGIN
        SET @retval = 1

        EXEC @retval = [Load_CustomerLookup]

        IF (@retval) <> 0
            PRINT 'Load of Customer Lookup Table Failed'

        EXEC @retval = [Load_CustomerInvoices]

        IF (@retval) <> 0
            PRINT 'Load of Customer Invoice Tables Failed'

        EXEC @retval = [Load_Payments]

        IF (@retval) <> 0
            PRINT 'Load of Payments Table Failed'
    END
    ELSE
        PRINT 'Table Creation Failed'

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

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

Хранимые процедуры возвращают любое значение, которое вы им сообщаете. Если нет оператора возврата, то они возвращают успех, 0.

Общепринятая практика - возвращать 0 в случае успеха и код ошибки в случае ошибки. Но это не соблюдается.

Вы имеете в виду пользовательские хранимые процедуры. Вам нужно выяснить, как они работают в вашей среде.

Я также рекомендую поместить тело хранимой процедуры в блок begin / end.

0 голосов
/ 22 апреля 2019

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

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

CREATE PROC dbo.ExampleCompilationError
AS
SELECT * FROM dbo.ThisTableDoesNotExist;
GO

DECLARE @rc int = NULL;
EXEC @rc = dbo.ExampleCompilationError;
SELECT @rc;
GO

Код возврата по-прежнему NULL с этим кодом.

Вы можете окружить каждое выполнение процедуры TRY / CATCH, который будет отлавливать ошибки компиляции и ошибки времени выполнения во внутренней области видимости:

BEGIN TRY
    EXEC dbo.ExampleCompilationError;
END TRY
BEGIN CATCH
    PRINT 'ExampleCompolationError failed';
END CATCH;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...