Как избежать tSQLt, чтобы прервать вызываемый процесс после raiserror? - PullRequest
1 голос
/ 28 марта 2019

В наших хранимых процедурах нам нравится «возвращать» определенное возвращаемое значение после повышения и ошибки, используя raiserror ()

Для этого мы используем низкие уровни серьезности (например, 12), за которыми следуетвозвращаемое значение, например:

create or alter proc dbo.usp_test 
as
begin
    print '**start of proc'
    raiserror( 'error on purpose',12,1);
    print '**after the error'
    return -3
end

Это прекрасно работает при запуске этой процедуры:

declare @RC int
exec @RC = dbo.usp_test
print concat('The return code is ', @RC)

    /* output:

    **start of proc
    Msg 50000, Level 12, State 1, Procedure usp_test, Line 6 [Batch Start Line 12]
    error on purpose
    **after the error
    The return code is -3

    */

Однако, когда этот proc вызывается из модульного теста, поведение неожиданно меняетсявыполнение прекращается после raiserror:

create schema T_usp_test authorization dbo;
GO
EXECUTE sp_addextendedproperty @name = 'tSQLt.TestClass', @value = 1, @level0type = 'SCHEMA', @level0name = 'T_usp_test'

GO

create or alter proc T_usp_test.[test mytest]
as
begin

    exec tSQLt.ExpectException;

    declare @RC int;
    exec @RC = dbo.usp_test;
    print concat('The return code is ', @RC)


end

GO

exec tSQLt.Run 'T_usp_test.[test mytest]'

    /* output:


    (1 row affected)
    **start of proc

    +----------------------+
    |Test Execution Summary|
    +----------------------+

    |No|Test Case Name            |Dur(ms)|Result |
    +--+--------------------------+-------+-------+
    |1 |[T_usp_test].[test mytest]|      7|Success|
    -----------------------------------------------------------------------------
    Test Case Summary: 1 test case(s) executed, 1 succeeded, 0 failed, 0 errored.
    -----------------------------------------------------------------------------

    */

Итак, вопрос:

1) почему поведение отличается, и процесс теперь внезапно останавливается, выполняя в raiserror()?

2) как я могу это преодолеть?

1 Ответ

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

Основной процесс, запускающий тест, - tSQLt.Private_RunTest, который запускает тест в блоке TRY ... CATCH. Из документов на https://docs.microsoft.com/en-us/sql/t-sql/language-elements/try-catch-transact-sql?view=sql-server-2017:

A TRY...CATCH construct catches all execution errors that have a severity higher than 10 that do not close the database connection.

Похоже, вы установили серьезность на 12. Рассмотрите возможность снижения серьезности вашего вызова RAISERROR и посмотрите, изменит ли это поведение. Вы также можете попробовать обернуть ваш вызов RAISERROR в его собственный блок TRY ... CATCH.

...