Размещение оператора THROW в цепочечных хранимых процедурах - PullRequest
0 голосов
/ 03 апреля 2020

У меня простой вопрос, касающийся использования оператора THROW в SQL Server 2016. У меня большое количество процедур, в которых я выполняю обработку ошибок TRY и CATCH. Вместо того, чтобы повторить мой код регистрации ошибок, у меня есть процедура регистрации

ALTER PROCEDURE [dbo].[spErrorLog]
       @Error_Database VARCHAR(20),
       @RecordID INT = 0,
       @Addl_Info VARCHAR(500) = '',
       @StaffID INT = 0

AS

--Records an SQL exception error.  Only the Error_Database paramter is required.
--This routine should only be executed within BEGIN CATCH and END CATCH statements

INSERT Error_log(
       Error_Number,
       Error_Procedure,
       Error_Line,
       Error_Message,
       StaffID,
       Error_Database,
       Addl_Info,
       RecordID)
VALUES(
       ISNULL(Error_Number(),-1),
       ISNULL(Error_Procedure(),'Outside a procedure'),
       ISNULL(Error_Line(),-1),
       ISNULL(Error_Message(),'No error message'),
       @StaffID,
       @Error_Database,
       @Addl_Info,
       @RecordID) 

Внутри каждой процедуры есть следующий код

BEGIN TRY
    --Some code here
END TRY
BEGIN CATCH
    EXEC spErrorLog 'MyDatabase',@ID, 'Additional error messaging', @StaffID;
END

Мой вопрос заключается в том, куда следует помещать инструкцию THROW. Внутри каждого оператора CATCH, например

BEGIN CATCH
    EXEC spErrorLog 'MyDatabase',@ID, 'Additional error messaging', @StaffID;
    THROW;
END

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

...