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 进行故障排除以启用分布式事务。
当我尝试在具有两个链接服务器的本地 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 进行故障排除以启用分布式事务。