2012-03-06 16 views
2

當我嘗試使用exec proc語句綁定參數時出現以下錯誤。如果我用select語句替換exec proc語句,則該命令有效。我在這裏錯過了什麼?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) 

這是我使用

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的內部運作可以解釋爲什麼這是行不通的命令。

對於任何有預期重複調用的語句準備(即語句包含'?'佔位符),Sybase實際上會將整個語句轉換爲存儲過程。

當它創建「實時」存儲過程時,它使用systables和syscolumns查找每個位置參數上的DECLARE所需的數據類型。當您嘗試針對存儲過程執行此操作時,並沒有這種快速查找(要求Sybase參數化您調用的存儲過程會降低速度優勢(如果有)使用'?'佔位符)的開銷。

在任何情況下,您都無法從臨時存儲過程調用存儲過程。使用別的東西來生成你想要的參數,並且每次都做一個完整的準備/執行。