【问题标题】:Output parameters are not populated未填充输出参数
【发布时间】:2016-04-20 09:56:17
【问题描述】:

我有以下代码:

conn = pymssql.connect(server, user, password, database)
cursor = conn.cursor()

id_new_field = pymssql.output(int)

res = cursor.callproc('NewField', ('Test',id_new_field))
conn.commit()
conn.close()

print(id_new_field.value)
print(res)

不幸的是,尽管存储过程正确执行,但我的输出参数没有填充字段的 id。输出始终为“无”。

我认为问题在于,在我的示例中自动提交设置为 false,对吗?

但我无法将 autocommit 设置为 true,因为存储过程在事务中未执行时会引发错误(它是供应商 SP,我无法更改 SP)。

所以,我现在的解决方法是使用 .execute() 而不是 .callproc() 并将原始 sql 写入我的 python 脚本。太可怕了。 ;)

有没有机会将.callproc() 与 autocommit = false 一起使用?

还是我必须完全不同?

【问题讨论】:

    标签: python sql-server stored-procedures pymssql


    【解决方案1】:

    我也收到了None

    print(id_new_field.value)
    

    但我可以通过简单地索引到 res 元组来检索值:

    print(res[1])
    

    (使用 Python 2.7.11 和 pymssql 2.1.1 测试。)

    【讨论】:

    • 对我不起作用。我正在使用 Python 3.5.1 和 pymssql 2.1.2。准确地说:它只工作了一次。我还用print(res) 尝试过。我第一次得到新字段的 id,但是当我第二次运行脚本时,结果又是“无”。
    • 您正在运行的存储过程一定有一些特殊之处。对于一般性问题“是否有机会将 .callproc() 与 autocommit = false 一起使用?” 的答案当然是“是”。您没有向我们展示您用作解决方法的 SQL 代码,因此我们无法知道您的 Python 代码可以做什么(如果有的话)来实现相同的结果。
    • @stefan2342xx - 仅供参考,它也适用于 Python 3.5.1 和 pymssql 2.1.2,即使我在同一个脚本中调用 SP 两次,中间没有 .commit()。无论您的问题是什么,看起来自动提交都不是罪魁祸首。
    • 感谢您的帮助。我将查看存储过程,也许我可以将 de SP 减少到最低限度并将其发布在这里。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2016-07-18
    • 2022-06-20
    • 1970-01-01
    相关资源
    最近更新 更多