2016-04-26 24 views
0

私は一部のユーザーに電子メールを送信し、電子メールデータをテーブルに保存する簡単なトランザクションを持っています。電子メールの送信時にエラーをキャッチできません

現在のクエリは次のようになります。私は電子メールのログテーブルをチェックするとき

BEGIN TRANSACTION T1 
BEGIN TRY 
EXEC [MSDB].dbo.sp_send_dbmail @profile_name='Email Test', 
@recipients='[email protected]', 
@subject='Testing auto notification sql jobs. Please ignore', 
@body_format = 'Text', 
@body = 'Hello', 
@query = 'some random query' 

IF @@ERROR <> 0 
BEGIN 
ROLLBACK TRANSACTION T1 
END 
ELSE 
BEGIN 

Update TBL_Email_Log set EmailSent = 'Y' 
COMMIT TRANSACTION T1 
END 
END TRY 

BEGIN CATCH 

PRINT ERROR_MESSAGE() 
ROLLBACK TRANSACTION T1 
END CATCH 

GO 

はどういうわけか、値がyに設定されています。トランザクションは何らかの理由でロールバックしていないようです。

私は確信しています、私はここで簡単なものを紛失しています。

編集:

クエリが失敗した場合、コードは機能しません。それは他のエラーを処理します。しかし、何らかの理由でクエリが失敗すると、@@ Errorはゼロを返し、例外も発生しません。

+0

正常に実行できたら、なぜそれがロールバックされますか? –

+0

2番目の部分が正常に実行されています。最初の部分は失敗している、私はそれを確認した。それでもそれは第二の部分に続きます。電子メールが送信に失敗した場合、停止する必要がありますが、停止しないでください。 – jitendragarg

答えて

0

最後に解決しました。クエリのエラーは@@ Errorとして返されるのではなく、代わりに返り値として返されます。したがって、変数を宣言し、その変数にリターンコードを保存し、その変数を@@ Errorとともに使用しました。

BEGIN TRANSACTION T1 
BEGIN TRY 
DECLARE @ReturnCode int 
EXEC @ReturnCode = [MSDB].dbo.sp_send_dbmail @profile_name='Email Test', 
... 

IF @@ERROR <> 0 OR @ReturnCode <> 0 
BEGIN 
ROLLBACK TRANSACTION T1 
END 
ELSE 
BEGIN 
Update TBL_Email_Log set EmailSent = 'Y' 
COMMIT TRANSACTION T1 
END 
END TRY 
... 
関連する問題