2015-06-21 204 views
3

我需要通過具有輸入參數名稱的pyodbc模塊從python2.7調用SqlServer stored procedurePython - 帶參數名稱的pyodbc調用存儲過程

我試圖根據documentation通過輸入參數順序:

cursor.execute('{CALL [SP_NAME](?,?)}', 
       ('value', 'value')) 

它的工作原理,但我需要通過parameter name of stored procedure因爲存儲過程的輸入參數的順序總是變化。所以我需要通過他們的名字。

cursor.execute('{CALL [SP_NAME](@param1name,@param2name)}', 
       ('value', 'value')) 

但是這不起作用。什麼是正確的語法?

+0

您正在使用哪種驅動下(正確的)結果,並在Linux或Windows?有時,TDS和驅動程序版本可能會影響存儲過程。 – FlipperPA

+0

@FlipperPA感謝您的關注。我正在使用Windows 8.而關於驅動程序,我沒有得到它。你什麼意思? –

回答

6

我該使用SQL Server 2008 R2以下存儲過程進行測試:

CREATE PROCEDURE [dbo].[breakfast] 
    @person varchar(50) = 'nobody', 
    @food varchar(50) = 'tofu' 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT @person + ' likes to eat ' + @food 
END 

壞消息( 「CALL」)

我發現

sql = """\ 
{ CALL breakfast (@food=?, @person=?) } 
""" 
params = ('bacon','Gord') 
crsr.execute(sql, params) 

給出了不一致的結果。

隨着{SQL Server Native Client 10.0} ODBC驅動程序,它忽略了參數和治療參數,位置,產生...

bacon likes to eat Gord 

...並與舊{SQL Server} ODBC驅動程序我剛剛得到了錯誤

DataError: ('22018', '[22018] [Microsoft][ODBC SQL Server Driver]Invalid character value for cast specification (0) (SQLExecDirectW)')

好消息( 「EXEC」)

我發現

sql = """\ 
EXEC breakfast @food=?, @person=? 
""" 
params = ('bacon','Gord') 
crsr.execute(sql, params) 

給我同時使用ODBC驅動程序

Gord likes to eat bacon 
-1

這句法似乎爲我工作:

cursor.execute('{CALL [SP_NAME](@param1name=?, @param2name=?)}', 
('value', 'value')) 
+0

感謝您的關注。請參閱@ GordThompson的回答:) –

相關問題