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

SQL linked server Python pyodbc insert error

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

上述驱魔的目的是将数据从一个链接服务器移动到另一个。

当我从 SSMS 触发存储过程时,它就像一个魅力,但是当我从 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()

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

我也测试了上面的连接;我能够 运行 select 对来自 python.

的链接服务器的语句

更烦人的是,当我用 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-scrips 并且对错误感到有点困惑。

提前非常感谢您的时间和智慧!

您已启动事务,并且链接服务器配置为在事务中登记远程服务器,这需要 MSDTC。所以

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

2) 使用 sp_serveroption

禁用链接服务器的 remote proc transaction promotion 选项

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