我需要通过带有输入参数名称的pyodbc模块从python2.7调用sqlServer存储过程.
我通过输入参数顺序尝试基于documentation:
cursor.execute('{CALL [SP_NAME](?,?)}',('value','value'))
它工作,但我需要传递存储过程的参数名称,因为存储过程输入参数的顺序总是改变.所以我需要通过名字传递它们.
cursor.execute('{CALL [SP_NAME](@param1name,@param2name)}','value'))
但是这不起作用.什么是正确的语法?
解决方法
我使用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',params)
使用两个ODBC驱动程序给我以下(正确)结果
Gord likes to eat bacon