2017-06-02 24 views
0

現在、Python 3.4.2およびpypyodbc 1.3.6を実行しています。Python 3およびpypyodbcストアドプロシージャエラー

SQLサーバー上でストアドプロシージャを実行しようとしています。必要なパラメータ(日付)を指定せずにストアドプロシージャを実行すると、パラメータが必要であるというエラーが表示されます(これは予期されていました)。

無効なカーソル状態:私はこの日付に追加すると

私はというエラーを取得します。

日付が正しい形式であることを確認しました(YYYY-MM-DD)と私はそれを複数の方法で試しましたが、毎回同じエラーが発生しました。

import pypyodbc as odbc 

connection_string = "DRIVER={SQL SERVER};SERVER=SERVERNAME;DATABASE=DATABASE;Trusted_Connection=yes" 
conn = odbc.connect(connection_string) 
cur = conn.cursor() 
cur.execute("exec stored_procedure '2017-05-01'") 
report_temp = cur.fetchall() 

エラーを受信:すべてのヘルプは高く評価され

line 975, in ctrl_err raise ProgrammingError(state,err_text) 
pypyodbc.ProgrammingError: ('24000', '[24000] [Microsoft][ODBC SQL Server Driver]Invalid cursor state') 

以下

は、私が使用していたコードです。

答えて

1

ストアドプロシージャが結果セットの前に行数やその他のメッセージを出力していないことを確認します。これは、pythonドライバを混乱させる可能性があります。 EG、この手順では、そのコード

create or alter procedure stored_procedure @date datetime 
as 
begin 
    --set nocount on 
    select * into #t from sys.objects 
    select * from #t 
end 

のためにそのエラーで失敗します。しかし、それは私は強くあなたがこのようなクエリでは、パラメータの交換を使用することをお勧めします

create or alter procedure stored_procedure @date datetime 
as 
begin 
    set nocount on 
    select * into #t from sys.objects 
    select * from #t 
end 
1

を成功することを可能にする「にNOCOUNTセット」アンコメント、CALL機能を使用してストアード・プロシージャーを呼び出すこともできます。

cur.execute('{CALL stored_procedure(?)}', ('2017-05-01',)) 

これが24000エラーで失敗する理由はいくつかあります。最も一般的なのは、ストアドプロシージャでSET NOCOUNT ONステートメントを使用していませんが、複数の結果セットを返すものでもこのエラーが発生します。

戻り値のサイズの大きなデータ要素(たとえば、最大8KBのテキストを返すように設定されている場合は1MBのテキストブロック)など、このエラーが発生する可能性があります。 NOCOUNT修正が機能しない場合は、ストアドプロシージャも参照する必要があります。

関連する問題