Skip to main content
 首页 » 编程设计

python之sqlalchemy:bindparam 和 exec proc 在文本中不起作用

2025年05月04日10kerrycode

尝试使用 exec proc 语句绑定(bind)参数时出现以下错误。如果我用 select 语句替换 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) 

这是我正在使用的命令

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

请您参考如下方法:

Sybase 的一些内部工作原理可以解释为什么这行不通。

对于任何预期重复调用的语句准备(即语句包含“?”占位符),Sybase 实际上会将整个语句转换为存储过程。

当它创建“即时”存储过程时,它使用 systables 和 syscolumns 来查找每个位置参数上 DECLARE 所需的数据类型。当您尝试针对存储过程执行此操作时,没有这样快速的查找(要求 Sybase 参数化您正在调用的存储过程的开销会破坏使用“?”占位符的速度优势 [如果有的话])。

无论如何,您不能从临时存储过程中调用存储过程。使用其他东西来生成您想要的参数,并且每次都进行完整的准备/执行。