2012-03-06 2 views
2

bind proam文でbindparamを実行しようとすると、以下のエラーが表示されます。 exec文をselect文で置き換えると、コマンドが機能します。ここに何かがないのですか?sqlalchemy:bindparamとexec procがテキスト内で動作しない

sqlalchemy.exc.ProgrammingError: (ProgrammingError) ('42000', '[42000] [FreeTDS][SQL Server]The untyped variable ? is allowed only in in a WHERE clause or the SET clause of an UPDATE statement or the VALUES list of an INSERT statement\n (7332) (SQLPrepare)') 'exec TEST_proc @a=?, @b=?, @c=?, @d=?, @e=?, @f=?, @g=?, @h=?, @cptyAcronym=?, @i=?, @statusString=?' ('ABC', 'CBML', None, 'TI26615414X225', 'DEC', 'EFF', datetime.datetime(2012, 12, 3, 0, 0), datetime.datetime(2012, 12, 3, 0, 0), 'RAA', 'NYC', None) 

これは、私はこれが動作しない理由のSybaseの内部の仕組みの一部を説明することができ

t = text('exec TEST_proc %s' % param_string, bindparams = [a, b, c, d, e, f, g, h, i, j, statusString]) 

resultProxy = engine.execute(t) 

答えて

1

を使用していますコマンドです。

予想される繰り返し呼び出しがあるステートメント(つまり、ステートメントに '?'プレースホルダが含まれています)では、Sybaseは実際にはステートメント全体をストアドプロシージャに変換します。

"オンザフライ"ストアドプロシージャを作成するときは、systablesおよびsyscolumnsを使用して、各位置パラメータのDECLAREに必要なデータ型を検索します。これをストアド・プロシージャに対して実行しようとすると、そのような高速ルックアップはありません(Sybaseに、ストアド・プロシージャをパラメータ化して '?'プレースホルダを使用すると速度優位性を犠牲にするというオーバーヘッド)。

いずれにしても、ストアドプロシージャを一時ストアドプロシージャから呼び出すことはできません。必要なパラメータを生成するために何か他のものを使用し、毎回完全な準備/実行を行います。

関連する問題