执行使用 PyMSSQL 引用链接服务器的存储过程时出错

Posted

技术标签:

【中文标题】执行使用 PyMSSQL 引用链接服务器的存储过程时出错【英文标题】:Error Executing Stored Procedure that References Linked Server with PyMSSQL 【发布时间】:2016-08-08 19:45:13 【问题描述】:

我正在尝试通过 pymssql 从 python 脚本执行存储过程,该脚本与链接服务器进行通信。 SP 在手动运行时有效,但从 python 脚本运行时会出现以下错误:

(7391, 'The operation could not be performed because OLE DB 
provider"SQLNCLI11" for linked server "DBLOG" was unable to begin a 
distributed transaction.DB-Lib error message 20018, severity 16:
\nGeneral SQL Server error: Check messages from the SQL Server\n')

我无法在 pymssql 本身中找到任何将此作为限制的内容。我不太确定从哪里开始。我用 pymssql 做了很多工作,从来没有遇到任何连接问题,而且我已经验证了我使用的登录有足够的权限(我什至尝试过使用 SA)。

有什么想法吗?

谢谢!

【问题讨论】:

【参考方案1】:

我能够通过尝试在链接服务器上执行更新的 SP 重新创建问题,例如,

UPDATE LINKEDSERVERNAME...TableName SET ...

虽然我的错误信息略有不同

(8501,“服务器 'PANORAMA\SQLEXPRESS' 上的 MSDTC 不可用。DB-Lib 错误消息 20018,...

我可以通过在pymssql.connect 调用的末尾添加一个autocommit=True 参数来避免这个问题。

如果由于某种原因使用 autocommit=True 对您不利,请查看

MSDTC on server 'server is unavailable

有关配置 MSDTC 的信息。

【讨论】:

完美解决了这个问题!现在我正在解决我的存储过程看似随机退出的问题。我取出所有打印语句并设置 nocount ,这似乎解决了它。但现在它偶尔会再次发生。

以上是关于执行使用 PyMSSQL 引用链接服务器的存储过程时出错的主要内容,如果未能解决你的问题,请参考以下文章

得到存储过程pymssql返回值

Python链接Mssql之Python库pymssql

从存储过程pymssql获取返回值

在 pymssql 中使用 `query` 和 `callproc` 调用存储过程的区别

使用 pymssql,如何使用输出调用存储过程

pymssql调用sqlserver存储过程带output 参数