【问题标题】:Python 3.6 pyodbc to SQL How to execute SPPython 3.6 pyodbc to SQL 如何执行SP
【发布时间】:2017-07-20 19:17:23
【问题描述】:

我创建了一个 Python 脚本来使用我的光标和连接 odbc 来执行 SP。我已经尝试了所有找到的方法,但我无法执行所需的程序。我的代码如下:

import pyodbc
conn = pyodbc.connect( 'DRIVER={SQL Server};'
                           'SERVER=XXXXXX;'
                           'DATABASE=XXX;UID=XXXX;'
                           'PWD=XXX')
cursor = conn.cursor()
cmd_prod_executesp = 'EXECUTE DC_SAS_EvaluationUpdate'
cursor.execute(cmd_prod_executesp)
conn.close()

我试过了:

cmd_prod_executesp = '{call DC_SAS_EvaluationUpdate}'
cmd_prod_executesp = 'exec DC_SAS_EvaluationUpdate'
cmd_prod_executesp = '{CALL DC_SAS_EvaluationUpdate}'

感谢您的帮助

非常感谢

【问题讨论】:

  • 你的sp有带参数吗?
  • @OLIVER.KOO not buddy 只是一个简单的执行,但它让我发疯了!!
  • 尝试像这样cursor.execute(" exec DC_SAS_EvaluationUpdate") 将sql 直接放在execute() 中,你也收到任何错误消息吗?
  • 我想知道您可能没有正确的驱动程序。但另一个原因可能是您在执行 sp 后没有提交。所以把conn.commit()放在cursor.execute()之后
  • 好友通过 conn.autocommit = True 想通了。即使我在我的 SP 中做了一个提交,谢谢好友。如何在 LinkedIn 或类似的网站上联系到您。谢谢@GordThompson

标签: python sql-server python-3.x pycharm pyodbc


【解决方案1】:

非常感谢大家的 cmets。最后,在@GordThompson 的快速评论中,我应用了以下更改并且效果很好。

导入pyodbc

conn = pyodbc.connect( 'DRIVER={SQL Server};'
                       'SERVER=XXXX;'
                       'DATABASE=XX;UID=XXXX;'
                       'PWD=XXXX')
cursor = conn.cursor()

cmd_prod_executesp = """EXEC DC_SAS_EvaluationUpdate """
conn.autocommit = True
cursor.execute(cmd_prod_executesp)

conn.close()

【讨论】:

  • 您还可以在创建连接时将自动提交设置为 true。这种方式更常见。 conn = pyodbc.connect( 'DRIVER={SQL Server};' 'SERVER=XXXX;' 'DATABASE=XX;UID=XXXX;' 'PWD=XXXX;' 'autocommit=True;')记得在 pyodbc.connect() 中自动提交默认是禁用的
【解决方案2】:

这里有两个对我有用的例子。我将显示参数,因为我猜你也需要知道如何做到这一点。

使用命名参数:

cursor.execute('EXEC usp_get_user_data @name = ?, @username = ?', 'tim', 'flipperpa')

带位置参数:

cursor.execute('EXEC usp_get_user_data ?, ?', None, 'flipperpa')

祝你好运!

【讨论】:

  • 我什至尝试过 CALL 并且它不起作用:( OMG。最奇怪的事情是我已经在同一台服务器中成功执行了选择和插入,这只是 SP 的执行它没有工作
  • IIRC, CALL 用于 MySQL。你能尝试创建一个非常简单的存储过程,它只返回像SELECT 'HELLO WORLD' 这样简单的东西并尝试执行它吗?
  • 哥们,当我去数据库并手动执行时,这太奇怪了。我将在 GitHub 存储库中创建我的脚本,向大家展示有关我的脚本的更多详细信息
  • 是的,您想使用exec?因为exec 用于SQL 服务器格式cursor.execute("exec sp_dosomething(123, 'abc')")call 用于ODBC 格式cursor.execute("{call sp_dosomething(123, 'abc')}")
  • 您通过 SSMS 连接的用户是否与您通过 Python 连接的用户相同?
【解决方案3】:

我认为您的代码看起来不错,因为您确实遵循了 pyodbc 的指南

//SQL Server format

cursor.execute("exec sp_dosomething(123, 'abc')")

//ODBC format

cursor.execute("{call sp_dosomething(123, 'abc')}")

从你的评论中你说你看到了消息

`进程以退出代码0'结束

这意味着一切正常。如果您的程序中发生任何异常/错误,您的程序应该生成一个带有非零参数的退出代码。

所以我认为你的程序运行良好,SP 确实被执行了。但是,我怀疑您没有看到更改在您的数据库中生效可能是因为您在执行 sp 之后和关闭与数据库的连接之前没有commit()您的更改。

所以像这样添加conn.commit()

cursor.execute(cmd_prod_executesp)
conn.commit()

编辑: 尝试为 MsSQL 使用较新的驱动程序

 conn = pyodbc.connect(driver = '{SQL Server Native Client 10.0}', server = 'xxxxxx',database = 'xxxx', uid = 'xx', pwd = 'xxxx')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多