2017-12-21 32 views
1

私は、ファイルのロード手順を自動化するスクリプトを作成中です。だから当然、私は既に存在するいくつかのストアドプロシージャを実行する必要があります。私はpyodbcを使ってデータベースに接続しています。私は、データベースからSELECT完全に罰金することができますが、私はこのエラーを取得し、データベースから実行しようとすると:pyodbcストアドプロシージャ/ Microsoft SQL Serverエラー42000

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

私はここでの問題が何であるかを把握することはできません - ユーザーは、完全なDB管理者権限を持っています、 pyodbcの公式ドキュメントに記載されている内容に基づいて構文が正しいことがわかります。ここ

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

TEMPは、その特定のデータベース内のストアドプロシージャのタイプのスキーマです。つまり、ストアドプロシージャの完全な名前です。私はちょうど私がちょうど行方不明であることはおそらく何かばかげて明らかであるように感じる。

+1

を使用?あなたはtrusted_credentialsを使用していますか? –

+0

私はUIDとPWDを使用していました。私はそれをTrusted_Connectionに変更し、'何も変更しませんでした。コマンドから{}も削除しましたが、今は動作します。手助けをしていただきありがとうございます。ドキュメンテーションは私を捨てました。 – dmcoding

答えて

0

私はそれを修正するためにいくつかのことを試しました。 @Brian Pendletonが提案したように、私はUIDPWDからtrusted_connection=Trueに定義された明示的なデータベースユーザーから変更しようとしました。残念ながらそれは何も変わらなかった。

しかし、好奇心の中で、私は関数呼び出しから中括弧を取り除くことが何をするのかを知ることにしました。実行は即座に実行され、望ましい出力が得られました。 pyodbcのwikiのドキュメントは悪い例を示しているか、バグが見つかりました。私は自分の状況が異常になっているかどうかわからないので、複製する方法がわかりません。

あるいは、言い換えれば、代わりの

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

私はどのようにして `conn`を作成しなかった

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

それは私の次の提案になるだろう。私はpyobdcから常時格納されているprocsを使用しています。中括弧は一度も追加していませんでしたので、この問題に遭遇したことはありません。あなたはそれを固定してうれしいです。 –

+0

ちょうど別の推薦:あなたはかなり古いドライバ( '10.0')を使用しているようです。 Python 3でのUTF-8変換のサポートが向上しているので、 '11.0'の使用を検討することもできます。 – FlipperPA

+1

問題は' EXEC'で中括弧を使用していました。ストアドプロシージャを呼び出すODBCの標準的な方法は、 'CALL'キーワードで中括弧を使用することです。 –

関連する問題