我尝试在具有两个链接服务器的本地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脚本,并且对此错误感到困惑。
在此先感谢您的时间和脑力!
您已经开始了事务,并且链接服务器被配置为在事务中注册远程服务器,这需要MSDTC。所以
1)不要开始交易。您可能已关闭autocommit
,这导致会话使用implicit transactions。
2)使用remote proc transaction promotion
禁用链接服务器的sp_serveroption选项>
3)对MSDTC进行故障排除以启用分布式事务。