Aufruf von Gespeicherten Prozeduren über freeTDS (Update)

Will man unter Linux eine Gespeicherte Prozedur auf einem Microsoft SQL-Server nutzen, bleibt einem eigentlich nur die Verwendung von freeTDS. Leider tappt man recht schnell in ein paar unschöne Probleme.

So bekommt man beispielsweise für den Aufruf einer Gespeicherten Prozedur, der über den SQLSRV-Treiber unter Windows ohne Murren und Knurren funktioniert, über freeTDS Meldungen wie z.B.:

„Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection. This ensures consistent query semantics. Enable these options and then reissue your query.“

oder auch

„INSERT failed because the following SET options have incorrect settings: ‚CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_PADDING‘. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations.“

um die Ohren geworfen.

Googelt man den Problemen hinterher, dann stellt sich heraus, dass die Voreinstellungen von freeTDS nicht zu dem passen, was der SQL-Server erwartet. Das lässt sich allerdings beheben, indem man diese Einstellungen explizit mit SET-Statements in den Gespeicherten Prozeduren vornimmt.

Ein passender Rumpf für die Erstellung einer Gespeicherten Prozedur zur Nutzung mit freeTDS könnte also so aussehen:

Hoffentlich spart das künftig einigen von Euch etwas Sucharbeit 🙂

Update 2015-10-08

Da ich gerade über einen Prozeduraufruf stolperte, der über freeTDS einfach nur eine leere Ergebnismenge zurückgeben wollte, muss ich hier noch etwas ergänzen: Wenn man in einer gespeicherten Prozedur temporäre Tabellen verwendet, in die auch NULL-Werte hereinlaufen können, braucht man unbedingt noch ein SET ANSI_NULL_DFLT_ON ON, sonst liefert die Ausgabe über freeTDS immer nur ein Result Set der Größe 0. Der Rumpf einer passenden Prozedur sollte dann also so aussehen: