Sql-Server

如果在 SQL 伺服器上使用 SSMS 導入,導入的 SSIS 包會失敗,但在從遠端 PC 導入時可以工作

  • November 20, 2019

我在 EC2 上的 AWS 中執行的 SQL Server 2017 企業版面臨一個奇怪的問題。

當我們在 SQL 伺服器上並使用連接到集成服務的本地安裝的 SSMS 導入 SSIS 包時,它是成功的。但是,包無法執行並出現​​錯誤:

The binary code for the script is not found. 
Please open the script in the designer by clicking Edit Script button and make sure it builds successfully.

但是,如果我們使用安裝在 PC 上的 SSMS 從遠端連接的 Windows 10 PC 執行完全相同的過程,則該程序包將正常執行。

伺服器和 Windows 工作站都執行 SSMS 17.9.1。在 Help -> About 中比較版本會在所有內容上顯示完全相同的版本號。同一域使用者正在執行該過程,並且該使用者是域管理員和 SQL 系統管理員。

這是沒有意義的。是否有其他我不知道的組件正在使用?有任何想法嗎?

這是我在這個問題上的發現。

首先,我在導入後從伺服器導出了損壞的包。導入後我還從伺服器導出了工作包。我並排比較了這兩個文件,很快發現我們包中發生錯誤的腳本缺少BinaryItem元素中的二進制數據。我還可以使用以下查詢直接查看伺服器上的包數據:

SELECT id
   ,NAME
   ,CAST(CAST(packagedata AS VARBINARY(MAX)) AS XML) PackageXML
   ,description
FROM [msdb].[dbo].[sysssispackages]

缺少的二進制程式碼向我表明,在導入過程中腳本沒有被正確編譯。

在浪費了很多時間試圖找出原因之後,我意識到腳本相當簡單,所以我應該看看腳本,看看裡面有什麼可能導致導入失敗。

我發現了一個引用,Microsoft.Office.Interop.Excel它是隨 Microsoft Office 一起安裝的 Microsoft Office Primary Interop Assemblies 的一部分。在 SQL 伺服器上,沒有安裝 Microsoft Office。因此,SQL 伺服器上缺少與此引用相關的 .DLL 文件。

刪除錯誤的和不需要的參考解決了這個問題。我能夠通過 Process Monitor 確認伺服器在導入期間正在尋找這個 .DLL 文件,但無法找到它。

顯然,如果在導入期間發生這種情況,則沒有失敗的跡象。長話短說,錯誤資訊是準確的。二進制程式碼失去。這是由於在導入期間未能編譯原始碼造成的。

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