Использование подхода, описанного в http://www.sommarskog.se/error_handling_2005.html, похоже, пока работает достаточно.Требуется только обновление хранимой процедуры верхнего уровня, и она выведет имя хранимой процедуры, которая завершилась ошибкой, и номер строки для агента SQL.
Ошибка вывода будет выглядеть следующим образом:
Выполнено от имени пользователя: NT AUTHORITY \ NETWORK SERVICE.*** [InnerInnerStoredProc2], 5. Errno 208: недопустимое имя объекта «NonExistentTable».[SQLSTATE 42000] (ошибка 50000) Запустите [SQLSTATE 01000] (ошибка 0).Шаг не выполнен.
Сводка шагов:
Создайте следующую хранимую процедуру обработчика ошибок:
CREATE PROCEDURE error_handler_sp AS
DECLARE @errmsg nvarchar(2048),
@severity tinyint,
@state tinyint,
@errno int,
@proc sysname,
@lineno int
SELECT @errmsg = error_message(), @severity = error_severity(), -- 10
@state = error_state(), @errno = error_number(),
@proc = error_procedure(), @lineno = error_line()
IF @errmsg NOT LIKE '***%' -- 11
BEGIN
SELECT @errmsg = '*** ' + coalesce(quotename(@proc), '<dynamic SQL>') +
', ' + ltrim(str(@lineno)) + '. Errno ' +
ltrim(str(@errno)) + ': ' + @errmsg
RAISERROR(@errmsg, @severity, @state)
END
ELSE
RAISERROR(@errmsg, @severity, @state)
go
Оберните хранимый процесс верхнего уровня в триггере try следующим образом
BEGIN TRY
SET NOCOUNT ON
SET XACT_ABORT ON
EXEC InnerStoredProc1
EXEC InnerStoredProc2
END TRY
BEGIN CATCH
IF @@trancount > 0 ROLLBACK TRANSACTION
EXEC error_handler_sp
RETURN 55555
END CATCH