2016-04-26 6 views
0

Ich habe eine einfache Transaktion, wo ich eine E-Mail an einige Benutzer senden, und speichern Sie die E-Mail-Daten in einer Tabelle.Fehler beim Senden der E-Mail nicht möglich

Meine aktuelle Abfrage sieht so aus.

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 

Irgendwie, wenn ich die E-Mail-Protokolltabelle überprüfen, wird der Wert auf y festgelegt. Die Transaktion scheint aus irgendeinem Grund nicht rückgängig zu machen.

Ich bin sicher, mir fehlt hier etwas Einfaches.

Edit:

den Code Stellt sich heraus, funktioniert nicht, wenn die Abfrage fehlschlägt. Es kümmert sich um andere Fehler. Wenn die Abfrage jedoch aus irgendeinem Grund fehlschlägt, gibt @@ Fehler den Wert 0 zurück und es tritt auch keine Ausnahme auf.

+0

Wenn es erfolgreich ausgeführt werden kann, warum wird es zurückgesetzt? –

+0

zweiter Teil wird erfolgreich ausgeführt. Der erste Teil scheitert, ich habe mich davon überzeugt. auch dann geht es weiter zum zweiten Teil. Wenn die E-Mail nicht gesendet werden konnte, sollte sie anhalten, tut dies aber nicht. – jitendragarg

Antwort

0

Schließlich, löste es. Es stellte sich heraus, dass Abfragefehler nicht als @@ Fehler zurückgegeben werden, sondern als Rückgabewert. Also, eine Variable deklariert, Rückgabecode gespeichert, um diese Variable, und dann diese Variable zusammen mit @@ Fehler verwendet.

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 
... 
Verwandte Themen