it-frosch
Goto Top

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.
-- 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.
errornumber
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.
ergebnis
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

Content-ID: 7571649762

Url: https://administrator.de/contentid/7571649762

Ausgedruckt am: 21.11.2024 um 12:11 Uhr

ukulele-7
ukulele-7 02.10.2023 aktualisiert um 18:52:27 Uhr
Goto Top
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.
it-frosch
it-frosch 02.10.2023 um 19:06:54 Uhr
Goto Top
@ukulele-7
Mir geht es ja um das Abfangen von Fehlern die ich so nich abfragen kann.
Wenn der user in den parameter der procedure 'delete from sys.databases' schreibt, dann möchte ich das ordentlich abfangen. face-wink
Bei solchem Müll gibt es dann eine Fehlerzeile vom SQL Server zurück, ich weiß nur nicht wie ich die so verarbeiten kann, dass ich in Powershell dann einen Wert zurückgebe mit dem ich dort weiterarbeiten kann.

Meiner Meinung nach gibt es zwei Wege.
Im erste Fall fange ich unter SQL alles ab und gebe nach Powershell nur definierte Werte zurück.
Im zweiten Fall nutze ich in Powershell try & catch, um eine exception in der SQL Ausführung abzufangen.
In diesem Fall habe ich m.E. aber keine Möglichkeit mir von der SQL Procedure Werte für die abgefangenen Fälle zurückgeben zu lassen, um dem User expliziert ausgeben zu können was das Problem war ("Die Kundennummer existiert nicht", "Die Eingabe für die Kundenummer ist nicht gültig").
Crusher79
Crusher79 02.10.2023 aktualisiert um 19:15:50 Uhr
Goto Top
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?
7907292512
7907292512 02.10.2023 aktualisiert um 19:53:37 Uhr
Goto Top
Throw ist dein Freund
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.
it-frosch
it-frosch 06.10.2023 um 12:01:32 Uhr
Goto Top
@Crusher79
Erste Frage also, womit machst du die Anbindung? Stell auch mal den Connection Str mit rein!

$SqlServer    = 'SQLSERVER' # SQL Server instance (HostName\InstanceName for named instance)  
$Database     = 'DB'           # SQL database to connect to   
$SqlAuthLogin = 'user'              # SQL Authentication login  
$SqlAuthPw    = 'pw'  # SQL Authentication login password  

$query_aufgaben = "exec [dbo.SP_procedure] kundennr, kontonr"  
$aufgaben = (Invoke-Sqlcmd -ConnectionString "Data Source=$SqlServer; Initial Catalog=$Database; User Id=$SqlAuthLogin; Password =$SqlAuthPw ;Encrypt = false" -Query "$query_aufgaben")