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

Aid*_*adi 5 sql-server django stored-procedures pyodbc python-2.7

我需要使用输入参数名称SqlServer stored procedure来自python2.7via pyodbc模块.

我根据输入参数顺序的文档尝试:

cursor.execute('{CALL [SP_NAME](?,?)}',
              ('value', 'value'))
Run Code Online (Sandbox Code Playgroud)

它工作,但我需要通过parameter name of stored procedure因为存储过程输入参数的顺序总是改变.所以我需要通过名字传递它们.

cursor.execute('{CALL [SP_NAME](@param1name,@param2name)}',
              ('value', 'value'))
Run Code Online (Sandbox Code Playgroud)

但这不起作用.什么是正确的语法?

Gor*_*son 11

我使用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
Run Code Online (Sandbox Code Playgroud)

坏消息("CALL")

我找到

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

给出了不一致的结果.

使用{SQL Server Native Client 10.0}ODBC驱动程序,它忽略了参数名称并将参数视为位置,产生...

bacon likes to eat Gord
Run Code Online (Sandbox Code Playgroud)

...并使用较旧的{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)
Run Code Online (Sandbox Code Playgroud)

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

Gord likes to eat bacon
Run Code Online (Sandbox Code Playgroud)