Sql-Server

如何在事務性 SSIS 包中使用 OPENROWSET 函式

  • January 18, 2022

我有一個 SSIS 包,其中一個組件是“執行 SQL 任務”,我在這個任務中編寫了一個 OPNEROWSET 查詢。當我將整個包的事務選項從“支持”配置為“必需”時,我收到此錯誤:

無法執行請求的操作,因為連結伺服器“(null)”的 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”不支持所需的事務介面。

當您想在 SSIS 中配置事務時,您必須執行服務“分佈式事務協調器”,並且該服務似乎與 openrowset 衝突。我該怎麼辦?有人遇到過這個問題嗎?

您可以關閉連結伺服器的 DTC 促銷

EXEC master.dbo.sp_serveroption @server=N'LincServer', @optname=N'remote proc transaction promotion', @optvalue=N'false'

並允許連結伺服器提供程序的非事務更新:

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'NonTransactedUpdates', 1

這可能會解決這個問題。請注意,您需要創建連結的伺服器定義,而不是使用臨時版本的 OPENROWSET。

但是在 SSIS 包中使用來自連結伺服器的 ACE 是一件很奇怪的事情。SSIS 應該直接連接。

從 ACE 下載頁面:

Access 數據庫引擎 2016 Redistributable 不適用於:. . . 供系統服務或伺服器端程序使用,其中程式碼將在系統帳戶下執行,或將同時處理多個使用者身份,或高度可重入並期望無狀態行為。範例包括在沒有使用者登錄時從任務調度程序執行的程序,或從伺服器端 Web 應用程序(如 ASP.NET)呼叫的程序,或在 COM+ 服務下執行的分佈式組件。

Microsoft Access 數據庫引擎 2016 可再發行組件

因此,最好從短期程序中使用 ACE,可能在普通使用者下執行。對於 SSIS 包執行使用短期程序,您可以控制這些程序的標識。

引用自:https://dba.stackexchange.com/questions/225053