尝试使用 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 参数化您正在调用的存储过程的开销会破坏使用“?”占位符的速度优势 [如果有的话])。
无论如何,您不能从临时存储过程中调用存储过程。使用其他东西来生成您想要的参数,并且每次都进行完整的准备/执行。
