SQL链接服务器Python pyodbc插入错误

问题描述 投票:0回答:1

我尝试在具有两个链接服务器的本地SQL服务器上触发SP时遇到一个有趣的错误。

上面的目的是将数据从一台链接的服务器移动到另一台。

[当我从SSMS触发SP时,它就像一个魅力,但是当我从Python触发它时,我得到了这些性感的错误消息:

(
'42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The OLE DB provider "SQLNCLI11" for linked server "XXXX" reported an error. One or more arguments were reported invalid by the provider. (7399) (SQLExecDirectW)
; [42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "XXXX" was unable to begin a distributed transaction. (7391)
; [42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]OLE DB provider "SQLNCLI11" for linked server "XXXX" returned message "The parameter is incorrect.". (7412)'
)

简而言之,我的python脚本(由于上述错误而失败)如下:

MyConn =  pyodbc.connect(DRIVER="ODBC Driver 17 for SQL Server",SERVER=os.environ["sqlServer"],UID=os.environ["sqlUID"],DATABASE=os.environ["sqlDB"],PWD=os.environ["sqlPWD"]) 
Cursor = MyConn.cursor()

sqlQuerey = "exec dbo.usp_XXXXETL @LookBackDays = 0"
Cursor.execute(sqlConta)

我还测试了上面的连接;我能够对来自python的链接服务器运行select语句。

更令人讨厌的是,当我用R编写它时,它可以工作:

conn = odbcDriverConnect("Driver={ODBC Driver 17 for SQL Server};Server=*SameServer*;Database=*SameDB*;Uid=*Uid*;Pwd=*Pwd*;Connection Timeout=360;") 

sqlExecute(
    conn, 
    query="dbo.usp_XXXXETL @LookBackDays = 0", 
    fetch=FALSE,
    errors=TRUE,
    query_timeout=300)

显然,它起作用了,所以这没什么大问题,只是我讨厌R脚本,并且对此错误感到困惑。

在此先感谢您的时间和脑力!

sql-server pyodbc linked-server
1个回答
1
投票

您已经开始了事务,并且链接服务器被配置为在事务中注册远程服务器,这需要MSDTC。所以

1)不要开始交易。您可能已关闭autocommit,这导致会话使用implicit transactions

2)使用remote proc transaction promotion禁用链接服务器的sp_serveroption选项>

3)对MSDTC进行故障排除以启用分布式事务。

© www.soinside.com 2019 - 2024. All rights reserved.