Почему это не улавливает ошибку в хранимой процедуре?

#sql #sql-server #stored-procedures

#sql #sql-сервер #хранимые процедуры

Вопрос:

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

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

Я думал, что хранимые процедуры возвращают 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'
  

Ответ №1:

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

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

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

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

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

Комментарии:

1. «Если нет оператора return, то они возвращают NULL». Это неверно. SP никогда не может вернуться NULL ; если вы попытаетесь выполнить a NULL , возникнет ошибка, а затем будет возвращено 0: learn.microsoft.com/en-us/sql/t-sql/language-elements /. … Что касается инструкции OP, system SPS вернет 0 для успеха, возможно, именно здесь у них создается впечатление.

2. DB<>Скрипка

3. @Larnu . . . Интересно, изменилось ли это со времен какой-то архаичной версии SQL Server. Я почти уверен, что потратил время на отладку проблем, вызванных NULL возвращаемыми значениями в sps. Ну что ж. Спасибо за информацию. Я обновил ответ.

Ответ №2:

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

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

 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;