web-dev-qa-db-ja.com

THROWでアラートを発生させる

SQL THROWには、RAISERRORが持つ重要な機能が欠けているようです。これは、エラー番号がアプリケーションログに記録されたときにアラートを発生させることができるようにWITH LOGを使用する機能です。 。私を逃れる簡単な方法はありますか、それとももっと面倒なRAISERRORsp_addmessage SPに頼る必要がありますか? THROWブロックでCATCHを使用してアラートを介してオペレーターに通知できるようにしたいと思います。

2

いいえ、THROWにはWITH LOGを含むいくつかのRAISERROR機能がありません。 SQL Server 2012がまだベータ版であったときに、これについてブログに書きましたが、それ以降、変更は加えられていません。

ただし、50000以外のカスタムメッセージ番号が必要な場合を除いて、RAISERRORメッセージをログに送信するためにsp_addmessageを使用する必要はありません。

DECLARE @s VARCHAR(32) = 'friend';
RAISERROR(N'What happened %s?', 19, 1, @s) WITH LOG;

結果:

enter image description here

質問の本質をもう一度読んで、あなたはおそらくあなたの究極の目標を達成するためにsp_addmessageを使いたいと思うでしょう。ロギングをそれ自体から分離しようとすべきではありませんでした(他のエラーがログに記録され、別のアラートが必要な場合、50000はあまり役に立ちません)。

RAISERRORによって生成されたメッセージのtextにエラー番号を入力する例:

BEGIN TRY
  SELECT 1/0;
END TRY
BEGIN CATCH
  DECLARE @err INT = ERROR_NUMBER();
  RAISERROR(N'What happened %d?', 19, 1, @err) WITH LOG;
END CATCH
4
Aaron Bertrand