我在尝试使用exec proc语句bindparam时遇到此错误。如果我用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)
答案 0 :(得分:1)
Sybase的一些内部工作原理可以解释为什么这不起作用。
对于任何预期重复调用的语句准备(即语句包含'?'占位符),Sybase实际上会将整个语句转换为存储过程。
当它创建“on-the-fly”存储过程时,它使用systables和syscolumns在每个位置参数上查找DECLARE所需的数据类型。当您尝试针对存储过程执行此操作时,没有这样的快速查找(要求Sybase参数化您正在调用的存储过程的开销会破坏使用'?'占位符的速度优势[如果有的话])。
在任何情况下,您都无法从临时存储过程调用存储过程。使用其他东西生成所需的参数,并每次都进行完整的准备/执行。