none
SQL Server-Agent: Job mittels T-SQL zum Abbruch bringen? RRS feed

  • Frage

  • Hallo,

    ich habe einen Auftrag angelegt, der vom SQL Server-Agent an jedem 16. des Monats ausgeführt wird. Der Job hat lediglich einen T-SQL- Schritt.

    Um eine versehntliche Ausführung des Jobs vor dem 16. des Monats zu verhindern habe ich folgenden Code hinzugefügt:

    IF DAY(GETDATE()) > 15
    BEGIN
       [...]
    END
    ELSE
    BEGIN
       RAISERROR (50001, 10, 1);
    END

    Wird der Job nun vor dem 16. ausgeführt, wird ganz richtig der ELSE-Zweig durchlaufen und der Job wird erfolgreich beendet.

    Um jedoch informiert zu werden, möchte ich, dass in einem solchen Fall der Job abbricht und auch die korrekte Fehlermeldung (hier: 50001) liefert. Ich habe mich im ELSE-Zweig schon mit sp_stop_job versucht, jedoch führt das nicht so recht zum gewünschten Ergebnis.

    Über Hilfe bin ich sehr dankbar.

    MfG Alex


    Donnerstag, 26. Juli 2012 10:29

Antworten

  • Hallo Alexander,

    aah, da kommen wir der Sache schon näher. Wenn ich die Fehlermeldung per

    EXEC sp_addmessage @msgnum= 50001 , @severity= 10 , @msgtext=  'Nur ein Test'

    anlege, dann wird bei mir der Job auch erfolgreich abgeschlossen. Das es bei Dir mit anderen Servities funktioniert, liegt daran, das Du vermutlich wie oben die Message eben mit dieser Servity = 10 angelegt hat.

    Ergo: Legt man keine Fehlermeldung an, was man ja auch nicht muss, wird der Job mit Fehler beendet; ist die Message vorhanden, wird des erfolgreich ausgeführt.

    P.S.: Besser keine EDIT in Posts, das bekommt man so schnell nicht mit und übersieht man leicht. 


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing


    Donnerstag, 26. Juli 2012 15:39

Alle Antworten

  • Hallo Alexander,

    das verstehe ich nicht so ganz, was Du da erreichen willst? Deine Ablaufsteuerung ist schon so aufgebaut, das vor den 16 nur ein RaisError erfolgt und sonst nichts weiter geschieht; wozu willst Du dann den Job noch abbrechen, er endet doch eh gleich im Anschluß?


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Donnerstag, 26. Juli 2012 10:35
  • Hallo Olaf,

    ja richtig. Der Job endet im Anschluß an das RaisError, allerdings erfolgreich. Ich möchte aber, dass der Job in diesem Fall "failed", damit der Operator über die Fehlermeldung 50001 informiert wird.

    Donnerstag, 26. Juli 2012 11:03
  • Hallo Alexander,

    wenn ich bei mir einen Job anlege, der nur

    RAISERROR (50001, 10, 1);
    

    ausführt und ich den Job starte, wird er mit Fehler beendet und ich erhalte darüber ein Email (Benachrichtigung bei Fehler war konfiguriert).

    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Donnerstag, 26. Juli 2012 11:13
  • Hallo Olaf,

    testhalber habe ich auch mal einen weiteren Auftrag angelegt, der nur diese eine Codezeile als T-SQL-Schritt enthält.

    Bei mir wird der Auftrag jedoch erfolgreich abgeschlossen mit der Meldung:

    "Executed as user: [...]. Um dieses Paket ausführen zu können, muss der 15. des aktuellen Monats abgelaufen sein. [SQLSTATE 01000] (Message 50001).  The step succeeded."

    Edit: unter den erweiterten Einstellung des Schritts ist auch "Beenden des Auftrags mit Fehlermeldung" bei "Aktion bei Fehler" angegeben.

    Edit2: offenbar wird der Job mit Fehler beendet, wenn ich den SQL-Schweregrad verändere (auf 9 oder 11,...). Ich hatte ihn per sp_addmessage mit dem Schweregrad 10 definiert. Aber warum definiert man einen Schweregrad, wenn man ihn dann erneut angeben und auch noch verändern muss? - Scheinbar habe ich da noch etwas nicht verstanden.

    Donnerstag, 26. Juli 2012 11:20
  • Hallo Alexander,

    aah, da kommen wir der Sache schon näher. Wenn ich die Fehlermeldung per

    EXEC sp_addmessage @msgnum= 50001 , @severity= 10 , @msgtext=  'Nur ein Test'

    anlege, dann wird bei mir der Job auch erfolgreich abgeschlossen. Das es bei Dir mit anderen Servities funktioniert, liegt daran, das Du vermutlich wie oben die Message eben mit dieser Servity = 10 angelegt hat.

    Ergo: Legt man keine Fehlermeldung an, was man ja auch nicht muss, wird der Job mit Fehler beendet; ist die Message vorhanden, wird des erfolgreich ausgeführt.

    P.S.: Besser keine EDIT in Posts, das bekommt man so schnell nicht mit und übersieht man leicht. 


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing


    Donnerstag, 26. Juli 2012 15:39
  • Hallo Olaf,

    danke für die Unterstützung! Ich habe jetzt den Schweregrad im RaisError einfach auf 16 gesetzt und erziele so das gewünschte Ergebnis.

    Danke nochmal!

    Freitag, 27. Juli 2012 05:53