Python - pyodbc使用参数名称调用存储过程

时间:2015-06-21 12:42:58

标签: sql-server django python-2.7 stored-procedures pyodbc

我需要使用输入参数名称从SqlServer stored procedure通过python2.7模块调用pyodbc

我通过输入参数顺序尝试基于documentation

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

它有效,但我需要传递parameter name of stored procedure,因为存储过程输入参数的顺序总是会改变。所以我需要按名称传递它们。

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

然而,这不起作用。什么是正确的语法?

2 个答案:

答案 0 :(得分:9)

我使用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驱动程序,它忽略参数 names 并将参数视为位置,产生...

bacon likes to eat Gord

...使用较旧的{SQL Server} ODBC驱动程序,我刚收到错误

  

DataError:(' 22018',' [22018] [Microsoft] [ODBC SQL Server驱动程序]转换规范的无效字符值(0)(SQLExecDirectW)')

好消息(" EXEC")

我找到了

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

使用两个ODBC驱动程序给我以下(正确的)结果

Gord likes to eat bacon

答案 1 :(得分:-1)

这种语法对我有用:

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