У меня простой вопрос, касающийся использования оператора 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 статей об обработке ошибок, и ни одна из них не посвящена этой проблеме. Спасибо за любой совет.