Try catch Nutzung in powershell bei sql procedure
Hallo Kollegen,
irgendwie stehe ich komplett auf dem Schlauch.
Ich möchte in Powershell eine sql procedure aufrufen. Diese soll mir entweder ein Ergebnis zurückgeben oder im Fehlerfall einen auswertbaren Wert damit ich diesen abfangen kann. Das Ziel ist alle möglichen Fehler so abzufangen, dass mir bei einem Fehler in der SQL Procedure nicht die powershell Anwendung abschmiert.
Im ersten Schritt habe ich einen Code der mir bei bestimmten Fehlern (Parameter ist negativ, Kundennr gibt es in der Tabelle nicht) einen definierten Wert nach Powershell zurückliefert.
Schwierigkeiten haben ich mit dem Abfangen von solchen Fehlern:
- es wird ein String anstatt dem geforderten Integer als Paramter übergeben
- der Wertebereich des Parameters passt nicht in den Typ - z.b. zu groß für integer
Bei solchen Fällen bekomme ich im SQL Server eine schöne Zeile mit Fehlercode, Message , State und Level angezeigt.
Klar kann ich mir das so anpassen, dass ich nur Errorcode = xxxxxx zurückbekomme.
Das scheint eine Tabelle mit einer Spalte und einem Wert zu sein.
Ich stelle mir in diesen Fällen aber vor, dass ich von der Procedure dann z.B ein Ergebnis = 1000 zurückbekomme.
Vergleichbar mit den Ergebnissen auf die oben genannten Fehler.
Das könnte ich in Powershell auswerten und dem User ein entsprechendes Feedback zurückgeben.
Ich habe schon mit try & catch experimentiert bin hier aber auf keinen grünen Zweig gekommen.
Eigentlich bin ich auf der Suche nach einen Beispielcode der genau das macht was ich erwarte, damit ich verstehen kann wo mein Denkfehler liegt.
Mache ich es mir einfach zu kompliziert oder wo denke ich hier falsch?
Vielleicht kann mir mal jemand aufs Pferd helfen.
Ja, ich mache so etwas zum ersten Mal. :D
Grüße vom it-frosch
irgendwie stehe ich komplett auf dem Schlauch.
Ich möchte in Powershell eine sql procedure aufrufen. Diese soll mir entweder ein Ergebnis zurückgeben oder im Fehlerfall einen auswertbaren Wert damit ich diesen abfangen kann. Das Ziel ist alle möglichen Fehler so abzufangen, dass mir bei einem Fehler in der SQL Procedure nicht die powershell Anwendung abschmiert.
Im ersten Schritt habe ich einen Code der mir bei bestimmten Fehlern (Parameter ist negativ, Kundennr gibt es in der Tabelle nicht) einen definierten Wert nach Powershell zurückliefert.
-- Prüfen ob Eingaben Zahlen sind
SET @STATUS = 0;
-- Kundennummer prüfen
IF ((ISNUMERIC(@INT_1)=0) OR (@INT_1<=0)) SET @STATUS=@STATUS+1;
-- Debitorenkontonr prüfen
IF ((ISNUMERIC(@INT_2)=0) OR (@INT_2<=0)) SET @STATUS=@STATUS+10;
-- Gültigkeit der Kundennummer prüfen
IF (select count(kundennr) from kunden where kundennr=@INT_1)=0 SET @STATUS=@STATUS+100
Schwierigkeiten haben ich mit dem Abfangen von solchen Fehlern:
- es wird ein String anstatt dem geforderten Integer als Paramter übergeben
- der Wertebereich des Parameters passt nicht in den Typ - z.b. zu groß für integer
Bei solchen Fällen bekomme ich im SQL Server eine schöne Zeile mit Fehlercode, Message , State und Level angezeigt.
Klar kann ich mir das so anpassen, dass ich nur Errorcode = xxxxxx zurückbekomme.
Das scheint eine Tabelle mit einer Spalte und einem Wert zu sein.
Ich stelle mir in diesen Fällen aber vor, dass ich von der Procedure dann z.B ein Ergebnis = 1000 zurückbekomme.
Vergleichbar mit den Ergebnissen auf die oben genannten Fehler.
Das könnte ich in Powershell auswerten und dem User ein entsprechendes Feedback zurückgeben.
Ich habe schon mit try & catch experimentiert bin hier aber auf keinen grünen Zweig gekommen.
Eigentlich bin ich auf der Suche nach einen Beispielcode der genau das macht was ich erwarte, damit ich verstehen kann wo mein Denkfehler liegt.
Mache ich es mir einfach zu kompliziert oder wo denke ich hier falsch?
Vielleicht kann mir mal jemand aufs Pferd helfen.
Ja, ich mache so etwas zum ersten Mal. :D
Grüße vom it-frosch
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 7571649762
Url: https://administrator.de/contentid/7571649762
Ausgedruckt am: 21.11.2024 um 12:11 Uhr
5 Kommentare
Neuester Kommentar
Ich kann leider nichts zum Zusammenspiel mit Powershell sagen aber wie verhält sich das denn mit RAISERROR?
https://learn.microsoft.com/en-us/sql/t-sql/language-elements/raiserror- ...
Das können z.B. diverse Anwendungen nativ zurück geben, nutze ich in einem CRM wenn mein Trigger einen Fehler ermittelt. Ich arbeite dann allerdings nur mit dem Fehlertext.
Mit TRY CATCH fange ich quasi "unverwartete" Fehler ab, das müsste ich mir nochmal angucken. Aber deine IF Anweisungen suchen ja sehr genau nach potenziellen Fehlern, da ist CATCH glaube ich nicht sinnvoll, da muss man es ja gar nicht erst zum Fehler kommen lassen.
https://learn.microsoft.com/en-us/sql/t-sql/language-elements/raiserror- ...
Das können z.B. diverse Anwendungen nativ zurück geben, nutze ich in einem CRM wenn mein Trigger einen Fehler ermittelt. Ich arbeite dann allerdings nur mit dem Fehlertext.
Mit TRY CATCH fange ich quasi "unverwartete" Fehler ab, das müsste ich mir nochmal angucken. Aber deine IF Anweisungen suchen ja sehr genau nach potenziellen Fehlern, da ist CATCH glaube ich nicht sinnvoll, da muss man es ja gar nicht erst zum Fehler kommen lassen.
Native Client oder Odbc? Meine selbst in C Sharp kann man das teils nicht mit normaler Exception abfangen. Aber es gibt Odbc Exception für solche Fälle.
Erste Frage also, womit machst du die Anbindung? Stell auch mal den Connection Str mit rein!
EDIT: https://www.mssqltips.com/sqlservertip/3509/error-handling-with-trycatch ...
Z. B. so?
Erste Frage also, womit machst du die Anbindung? Stell auch mal den Connection Str mit rein!
EDIT: https://www.mssqltips.com/sqlservertip/3509/error-handling-with-trycatch ...
Z. B. so?
Throw ist dein Freund
https://learn.microsoft.com/de-de/sql/t-sql/language-elements/throw-tran ...
Sid.
https://learn.microsoft.com/de-de/sql/t-sql/language-elements/throw-tran ...
IF @WERT > XX
THROW 50001,'Wert entspricht nicht den Vorgaben',1;
Sid.