Catch не передает error_message () удаленной хранимой процедуре, вызываемой внутри catch - PullRequest
0 голосов
/ 04 июня 2019

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

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

Теперькод, который я использую, выглядит следующим образом:

if OBJECT_ID('dbo.testLogProcLinkedServer') is not null
    drop procedure dbo.testLogProcLinkedServer;
go

CREATE PROCEDURE [dbo].[testLogProcLinkedServer]
AS
BEGIN
    set nocount on;

    declare @msg nvarchar(max),
            @dbId int = db_id();

    begin try
        declare @i int;

        set @i = 1 / 0;
    end try
    begin catch
        exec [MyLinkedServer].[Logging].dbo.spLogError  @objectId = @@PROCID, 
                                                        @databaseId = @dbId, 
                                                        @message = N'Testing catch errors, check field ErrorMessage for more information.';
    end catch
end
go

exec dbo.testLogProcLinkedServer;

Теперь дело в том, что ERROR_MESSAGE () не попадает в spLogError, это NULL.Но когда я удаляю MyLinkedServer (в моей среде разработки базы данных находятся на одном и том же сервере, поэтому я могу это сделать), ERROR_MESSAGE () становится доступным, и все работает как положено.

При поиске"tsql поймать связанный сервер" в Google.Я нахожу этот вопрос: Перехват ошибок через связанный сервер с серьезностью <20 </a>

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

Может кто-нибудь указать мне, что вызывает это?

1 Ответ

1 голос
/ 04 июня 2019

ERROR_MESSAGE() и другие контекстные функции ошибок доступны только в локальном блоке CATCH.Удаленная процедура игнорирует тот факт, что она вызывается из блока CATCH и не имеет доступа к контексту ошибки.

Вам нужно будет передать значение удаленному spLogError в качестве параметразначение для целей ведения журнала.

BEGIN CATCH
    @msg = N'Testing catch errors, ErrorMessage value is: '
        + ERROR_MESSAGE();
    EXEC [MyLinkedServer].[Logging].dbo.spLogError  @objectId = @@PROCID, 
                                                    @databaseId = @dbId, 
                                                    @message = @msg;
END CATCH;
...