sqlalchemy: bindparam и exec proc не работают в тексте - PullRequest
2 голосов
/ 07 марта 2012

Я получаю эту ошибку ниже при попытке связать с оператором exec proc.если я заменю оператор exec proc на оператор select, команда сработает.я что-то здесь упускаю?

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)

это команда, которую я использую

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 Ответ

1 голос
/ 07 марта 2014

Некоторые из внутренних особенностей Sybase могут объяснить, почему это не сработает.

Для любой подготовки оператора, когда есть ожидаемый повторный вызов (то есть оператор содержит заполнитель '?'), Sybase фактически превратит весь оператор в хранимую процедуру.

Когда он создает хранимую процедуру «на лету», он использует systables и syscolumns для поиска необходимых типов данных для DECLARE для каждого из позиционных параметров. Когда вы пытаетесь сделать это в отношении хранимой процедуры, такой быстрый поиск не выполняется (непроизводительные затраты на запрос Sybase для параметризации хранимой процедуры, которую вы вызываете, потеряют преимущество в скорости (если есть) использования заполнителей '?').

В любом случае вы не можете вызвать хранимую процедуру из временно хранимой процедуры. Используйте что-то еще для генерации параметров, которые вы хотите, и выполняйте полную подготовку / выполнение каждый раз.

...