Когда BACKUP DATABASE
генерирует ошибку, на самом деле генерирует два. К сожалению TRY/CATCH
, не может захватить первую ошибку; это только захватывает вторую ошибку.
Я подозреваю, что вам лучше всего понять реальную причину неудачного резервного копирования - автоматизировать резервное копирование с помощью SQLCMD (с -o
отправкой вывода в файл), SSIS, C #, PowerShell и т. Д. Все это даст вам гораздо больший контроль над захватом всех из ошибок.
Ответ SO в комментарии предлагает использовать DBCC OUTPUTBUFFER
- хотя это возможно, это совсем не похоже на детскую игру. Не стесняйтесь получать удовольствие от этой процедуры с сайта Эрланда Соммарскога , но, похоже, в сочетании с этим она не очень хорошо работает TRY/CATCH
.
Единственный способ, которым я, кажется, был в состоянии захватить сообщение об ошибке, spGET_LastErrorMessage
- это если фактическая ошибка действительно сброшена. Если вы заключите его в TRY/CATCH
ошибку, ошибка будет проглочена, а хранимая процедура ничего не сделает:
BEGIN TRY
EXEC sp_executesql N'backup that fails...';
END TRY
BEGIN CATCH
EXEC dbo.spGet_LastErrorMessage;
END CATCH
В SQL Server <2012 вы не можете повторно вызвать ошибку самостоятельно, но вы можете в SQL Server 2012 и новее. Итак, эти два варианта работают:
CREATE PROCEDURE dbo.dothebackup
AS
BEGIN
SET NOCOUNT ON;
EXEC sp_executesql N'backup that fails...';
END
GO
EXEC dbo.dothebackup;
EXEC dbo.spGET_LastErrorMessage;
Или в 2012 и выше, это работает, но в значительной степени противоречит цели TRY/CATCH
, так как исходная ошибка все еще появляется:
CREATE PROCEDURE dbo.dothebackup2
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
EXEC sp_executesql N'backup that fails...';
END TRY
BEGIN CATCH
THROW;
END CATCH
END
GO
EXEC dbo.dothebackup2;
EXEC dbo.spGET_LastErrorMessage;
Конечно, в обоих случаях ошибка по-прежнему выдается клиенту. Так что, если вы используете это, TRY/CATCH
чтобы избежать этого, если нет какой-либо лазейки, о которой я не думаю, я боюсь, что вам придется сделать выбор ... либо предоставьте пользователю ошибку и сможете получить сведения о это или подавить как ошибку, так и фактическую причину.