がBACKUP DATABASE
エラーを生成すると、実際には2つ生成されます。残念ながらTRY/CATCH
、最初のエラーをキャプチャすることはできません。2番目のエラーのみをキャプチャします。
失敗したバックアップの背後にある真の理由をキャプチャする最善の策は、バックアップを自動化することです SQLCMD(と-o
、ファイルに出力を送信するために)SSIS、C#、PowerShellのその他のすべてのあなたのキャプチャを超えるはるかに大きい制御与えるそれらのすべてをエラーの。
コメントのSO回答は使用を示唆しています DBCC OUTPUTBUFFER
-可能ですが、これは子供の遊びのようには見えません。Erland Sommarskogのサイトにあるこの手順を自由に楽しんでください。ただし、これをと組み合わせてもうまく機能しないようです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以降では可能です。したがって、次の2つのバリエーションが機能します。
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
を回避するために使用している場合、私が考えていない抜け穴がない限り、私はあなたが選択をする必要があると思います...ユーザーにエラーを与えて、詳細をキャプチャすることができますそれ、またはエラーと実際の理由の両方を抑制します。