2015-06-21 205 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的回答:) –

相关问题