2017-12-21 4 views
1

Ich arbeite an einem Skript, um eine Dateiladeprozedur zu automatisieren. Also muss ich natürlich einige gespeicherte Prozeduren ausführen, die bereits existieren. Ich verwende pyodbc, um eine Verbindung zu meiner Datenbank herzustellen. Ich kann SELECT völlig in Ordnung, aus der Datenbank, aber wenn ich versuche, aus der Datenbank auszuführen bekomme ich diesen Fehler:pyodbc gespeicherte Prozeduren/Microsoft SQL Server-Fehler 42000

pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][SQL Server Native Client 10.0] 
     Syntax error, permission violation, or other nonspecific error (0) (SQLExecDirectW)') 

ich nicht herausfinden kann, was das Problem hier ist - der Benutzer der volle DB Admin-Berechtigungen verfügt, Die Syntax ist korrekt, basierend auf der offiziellen Dokumentation der pyodbc.

print("Executing SP") 
conn.execute('{EXEC TEMP.s_p_test}') 
print("SP Executed.") 

Hier TEMP ist das Schema für die Art der gespeicherten Prozedur in dieser speziellen Datenbank. Das heißt, es ist der vollständige Name der gespeicherten Prozedur. Ich denke, es ist wahrscheinlich etwas dummes, dass ich nur vermisse.

+1

Wie haben Sie 'conn' erstellen? Verwenden Sie trusted_credentials? –

+0

Ich benutzte UID und PWD. Ich änderte das zu Trusted_Connection und es tat ' t nichts zu ändern. Ich habe auch die {} aus dem Befehl entfernt und jetzt funktioniert es. Vielen Dank für Ihre Hilfe. Die Dokumentation warf mich ab. – dmcoding

Antwort

0

Ich versuchte ein paar Dinge, um es zu beheben. Wie @Brian Pendleton vorgeschlagen hatte, hatte ich versucht, von einer expliziten Datenbank, die über UID und PWD definiert wurde, zu trusted_connection=True zu wechseln. Leider hat sich daran nichts geändert.

Aus Neugierde entschied ich mich jedoch zu sehen, was die geschweiften Klammern aus dem Funktionsaufruf tun würde. Die Ausführung hat sofort funktioniert und die gewünschte Ausgabe produziert. Es scheint, dass die Dokumentation im Wiki von pyodbc entweder schlechte Beispiele zeigt oder ich einen Fehler gefunden habe, den ich nicht zu reproduzieren weiß, weil ich nicht weiß, was meine Situation anormal macht.

Oder, mit anderen Worten, statt

conn.execute('{EXEC TEMP.s_p_test}') 

I

verwendet
conn.execute('EXEC TEMP.s_p_test') 
+0

Das war mein nächster Vorschlag. Ich benutze gespeicherte Prozeduren die ganze Zeit von pyobdc, und ich habe nie die geschweiften Klammern hinzugefügt, so dass ich nie auf dieses Problem stieß. Freut mich, dass du es repariert hast. –

+0

Nur eine weitere Empfehlung: Es scheint, dass Sie einen ziemlich alten Treiber ('10.0') verwenden. Sie könnten '11.0' verwenden, da es die UTF-8-Konvertierung in Python 3 besser unterstützt. – FlipperPA

+1

Das Problem war, geschweifte Klammern mit' EXEC' zu verwenden. Die ODBC-Standardmethode zum Aufrufen einer gespeicherten Prozedur besteht darin, geschweifte Klammern mit dem Schlüsselwort 'CALL' zu verwenden. –