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

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

我需要通过带有输入参数名称的 pyodbc 模块从 python2.7 调用 SqlServer 存储过程

我尝试基于documentation按输入参数顺序:

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

它可以工作,但我需要传递存储过程的参数名称,因为存储过程输入参数的顺序总是会改变。所以我需要按名称传递它们。

cursor.execute('{CALL [SP_NAME](@param1name,@param2name)}',
              ('value', '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 驱动程序,它忽略参数 names 并将参数视为位置参数,产生...

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

关于sql-server - Python - pyodbc 使用参数名称调用存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30964608/

相关文章:

python - 无法在 zsh 中使用事件 venv 运行 Django

python-2.7 - Python 请求 Post 请求在使用 Livy 连接到 Kerberized Hadoop 集群时失败

c# - 如何将 LINQ 嵌套 Selectmany 转换为 SQL 正则语句

sql-server - sqldumper错误导致C盘满

sql-server - SSIS,使用来自 SQL Server 的 ID 查询 Oracle 表?

python - Django 1.7 - 找不到教程

python - 将 any 与 QuerySet 一起使用是否不是最佳选择?

python - 加载pickled数据时cPickle EOFError

json - 使用postgresql从Flask-SQLAlchemy中的JSON字段查询值

sql-server - sql事务不回滚