【问题标题】:Python using Pyodbc connecting to Sql 2012 calling up a stored procedurePython 使用 Pyodbc 连接到 Sql 2012 调用存储过程
【发布时间】:2016-09-13 19:01:08
【问题描述】:

我有一个从 Sql 服务器运行时可以 100% 工作的存储过程。它更新至少 5 个不同的表。当我从 Python 运行它时,它只更新前两个表。未在其余表上完成。传递的参数与直接从 sql server 运行完全一样。每次测试都会将数据重置到一个共同的起点。有没有人在 Python 执行存储过程时遇到过这个问题?我在不到一个月前使用 Python 3.5 和 Pyodbc,Windows 上的 Sql 2012 客户端和服务器。这不是提交问题,因为前两个表正在更新/提交。它失败的sql语句一点也不复杂。我猜是某种限制,比如时间,还是只用给定的 sql 调用更新这么多表?我的下一步是将 Python 中的每个步骤作为单独的步骤执行,而不是从一个单独的步骤中执行所有存储过程,以查看是否有任何差异,但我希望不必这样做。

str_rs_SqlCommand = "{call dbo.usp_LaborLogBatchPerson ('Test User', '1')}"  ### Passes parameters to the stored procedure 
print (str_rs_SqlCommand)
obj_dbc_Connection2 = pyodbc.connect("DRIVER={SQL Server} " + " ;SERVER=" + str_dbc_ServerName + " ;DATABASE=" + str_dbc_Name + " ;UID=" + str_dbc_Uid + " ;PWD=" + str_dbc_Pwd + "" + "" ) #;autocommit=True #tried with and without autocommit
conn = obj_dbc_Connection2.cursor()    ### Create a cursor for the sql connection 
conn.execute(str_rs_SqlCommand) 
conn.commit()
obj_dbc_Connection2.close 

【问题讨论】:

  • 不提供任何代码,我不确定您期待什么样的帮助...
  • 代码是从命令行而不是网络运行的,所以就我熟悉这些技术协同工作而言,应该没有超时问题。如果有人在从命令行运行时遇到超时问题,请告诉我。
  • 什么代码有用?带有大量插入/更新的存储过程。我说从 Sql 服务器运行时 proc 运行正确。所以不同的是当它通过 pyodbc 从 Python 运行时。
  • 存储过程对您有帮助吗?运行部分存储过程的 Python 代码看起来与我执行其他不那么长且只做一件事的存储过程时没有什么不同。那工作很好。问题不在于代码不起作用。但它适用于某些存储过程,但不适用于其他存储过程。那些工作的只有一张表被更新。这个适用于 5 个以上的前 2 个。
  • 我将首先显示调用该过程的 Python 代码部分。然后是 SQL 的任何相关部分(是否正在使用它们的事务等)。我知道您说这不是“提交问题”,但是您如何 100% 确定是这种情况?

标签: python sql-server-2012 pyodbc


【解决方案1】:

我是通过逐步完成它正在做的事情找到它的。在存储过程中具有“打印语句”会在该步骤结束存储过程的执行。如果您在 Winderz 平台上使用 Python 3.5 和 Pyodbc 和 MSSql 2012,请确保不要在存储过程中使用 print 语句......

【讨论】:

  • 有谁知道如何捕获该错误?假设你从 Python 中得到一个。使用 Sql 客户端执行时没有错误,当您从 Python 运行相同的代码时会停止运行。
  • 如果您可以编辑 SP,并希望保留等效的打印语句,这似乎与 stackoverflow.com/a/1264635/1007939RAISERROR .. WITH NO WAIT 的替代相关。
  • 谢谢你,但我认为这不是相对的。如果我进行打印,Python ODBC 就会死掉。打印仅适用于 Sql。我从 Python 论坛上其他帖子的理解是 Python 需要一个单一的结果集。如果您从同一个存储过程返回多个结果集或在存储过程中执行打印语句,则会出现一些混淆问题。我也无法让它显示存储过程的结果集。从 Sql 中选择它可以工作,但似乎不适用于 Python。在这一点上,我得出结论,我必须为 Python 执行存储过程进行自定义
  • 我希望那里的人可能熟悉获取您的存储过程,例如具有打印功能的存储过程,从命令行使用 Python 和 Pyodbc。到目前为止,我还没有找到适用于此的在线示例或可以捕获从存储过程返回的结果集的在线示例。我怀疑是 python 数据捕获问题,或者可能是 Odbc 或 Pyodbc 的限制。在这一点上我不确定我是这种技术组合的新手,并且想知道其他人是否对我目前的水平有更深入的了解。不过感谢您的帮助。
  • SP 中的PRINT 语句本身似乎没有问题,因为this 对我来说很好用。
猜你喜欢
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多