MSSQLSERVER_6522

適用於:SQL Server

詳細資料

屬性
產品名稱 SQL Server
事件識別碼 6522
事件來源 MSSQLSERVER
元件 SQLEngine
符號名稱 SQLCLR_UDF_EXEC_FAILED
訊息文字 執行使用者定義常式或匯總 「%.*ls」 時發生 .NET Framework 錯誤: %ls。

說明

請考慮下列案例。

案例 1

您可以建立參考 Microsoft .NET Framework 元件的 Common Language Runtime (CLR) 常式。 .NET Framework 元件未記載于 922672 。 然後,您會安裝 .NET Framework 3.5 或 .NET Framework 2.0 型 Hotfix。

案例 2

您會建立元件,然後在 SQL Server 資料庫中註冊元件。 然後,您會在全域組件快取 (GAC) 中安裝不同版本的元件。

當您在 SQL Server 中執行 CLR 常式或使用上述任一案例中的元件時,您會收到類似下列的錯誤訊息:

伺服器:Msg 6522、層級 16、狀態 2、第 1 行
執行使用者定義常式或匯總 'getsid' 時發生 .NET Framework 錯誤:

System.IO.FileLoadException:無法載入檔案或元件 'System.DirectoryServices,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a' 或其其中一個相依性。 主機存放區中的元件與 GAC 中的元件不同。 (HRESULT 例外:0x80131050)

可能的原因

當 CLR 載入元件時,CLR 會確認相同的元件位於 GAC 中。 如果相同的元件位於 GAC 中,CLR 會確認這些元件的模組版本識別碼 (MVID) 相符。 如果這些元件的 MVID 不相符,您會收到說明 一節提及的錯誤訊息

重新編譯元件時,元件的 MVID 會變更。 因此,如果您更新 .NET Framework,.NET Framework 元件會有不同的 MVID,因為這些元件會重新編譯。 此外,如果您更新自己的元件,則會重新編譯元件。 因此,元件也有不同的 MVID。

使用者動作

動作 1

若要解決說明 一節中的 案例 1,您必須手動更新 SQL Server 中的 .NET Framework 元件。 若要這樣做,請使用 ALTER ASSEMBLY 語句指向下列資料夾中新版的 .NET Framework 元件:

%Windir%\Microsoft.NET\Framework\Version

注意

Version 代表您安裝或更新之 .NET Framework 的版本。

動作 2

若要解決 [說明 ] 區段中的案例 2 ,請使用 ALTER ASSEMBLY 語句來更新資料庫中的元件。

如果執行此動作之後仍存在問題,請從資料庫卸載元件,然後在資料庫中註冊新版本的元件。

其他相關資訊

我們不建議您使用未記載于 SQL Server CLR 裝載環境中的 未測試 .NET Framework 元件支援原則中的 .NET Framework 元件。 它會列出在 SQL Server CLR 裝載環境中測試的元件。

CLR 常式的描述

CLR 常式包含使用 SQL Server 與 .NET Framework CLR 整合所實作的下列物件:

  • 純量值使用者定義函式 (純量 UDF)
  • 資料表值使用者定義函式 (TVF)
  • 使用者定義程式 (UDP)
  • 使用者定義的觸發程式
  • 使用者定義資料類型
  • 使用者自訂彙總

安裝 .NET Framework 3.5 之後要更新的元件

安裝 .NET Framework 3.5 之後,您必須使用 ALTER ASSEMBLY 語句來更新下列元件:

  • Accessibility.dll
  • AspNetMMCExt.dll
  • Cscompmgd.dll
  • IEExecRemote.dll
  • IEHost.dll
  • IIEHost.dll
  • Microsoft.Build.Conversion.dll
  • Microsoft.Build.Engine.dll
  • Microsoft.Build.Framework.dll
  • Microsoft.Build.Tasks.dll
  • Microsoft.Build.Utilities.dll
  • Microsoft.CompactFramework.Build.Tasks.dll
  • Microsoft.JScript.dll
  • Microsoft.VisualBasic.Vsa.dll
  • Microsoft.Vsa.dll
  • Microsoft.Vsa.Vb.CodeDOMProcessor.dll
  • Microsoft_VsaVb.dll
  • Sysglobl.dll
  • System.Configuration.Install.dll
  • System.Design.dll
  • System.DirectoryServices.dll
  • System.DirectoryServices.Protocols.dll
  • System.Drawing.dll
  • System.Drawing.Design.dll
  • System.EnterpriseServices.dll
  • System.Management.dll
  • System.Messaging.dll
  • System.Runtime.Serialization.Formatters.Soap.dll
  • System.ServiceProcess.dll
  • System.Web.dll
  • System.Web.Mobile.dll
  • System.Web.RegularExpressions.dll

這些元件位於下列資料夾中:

%Windir%\Microsoft.NET\Framework\v2.0.50727

在您卸載元件之後,如何保留使用者定義資料類型的資料

如果您卸載 SQL Server 中使用者定義的資料類型所使用的元件,您可以使用下列其中一種方法來保留資料。

假設下列案例如下:

  • 您可以建立名稱為 MyAssembly.dll 的元件。
  • MyAssembly 元件會參考 System.DirectoryServices.dll 元件。
  • 您有使用者定義資料類型,其名稱為 MyDateTime
  • MyDateTime 資料類型會使用 MyAssembly.dll 元件。
  • 您可以建立名稱為 MyTable 的資料表。
  • MyTable 資料表包含 MyDateTime 資料類型的資料

方法 1:使用 bcp.exe 公用程式

  1. 使用 Bcp.exe 公用程式搭配 -n 參數,將資料從 MyTable 資料表複製到檔案中。 例如,在命令提示字元中執行下列命令:

    bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n -SSQLServerName -T
    
  2. 在 SQL Server Management Studio 中,遵循下列步驟:

    1. 卸載 MyTable 資料表。
    2. 卸載 MyDateTime 資料類型。
    3. 卸載 System.DirectoryServices.dll 元件。
    4. 卸載 MyAssembly 元件。
  3. 在 SQL Server Management Studio 中,遵循下列步驟:

    1. System.DirectoryServices.dll註冊元件。
    2. 註冊 MyAssembly 元件。
    3. 建立 MyDateTime 資料類型。
    4. 建立與 MyTable 資料表具有相同資料表結構的新資料表。
  4. 使用 Bcp.exe 公用程式搭配 -n 參數,將資料從檔案匯入 MyTable 資料表。 例如,在命令提示字元中執行下列命令:

    bcp MyDatabase.dbo.MyTable in C:\MyFile.bcp -n -SSQLServerName -T
    

方法 2:使用 INSERT ...SELECT 語句

假設 MyDateTime 資料類型在儲存體中佔用 9 個位元組。

  1. 在 SQL Server Management Studio 中,執行下列語句,建立包含 VARBINARY(9) 資料類型資料行的新資料表:

    CREATE TABLE TempTable (c1 VARBINARY(9));
    
  2. 執行下列 INSERT ...要填入 TempTable 資料表的 SELECT 語句:

    INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable;
    
  3. 在 SQL Server Management Studio 中,遵循下列步驟:

    1. 卸載 MyTable 資料表。
    2. 卸載 MyDateTime 資料類型。
    3. 卸載 System.DirectoryServices.dll 元件。
    4. 卸載 MyAssembly 元件。
  4. 在 SQL Server Management Studio 中,遵循下列步驟:

    1. 註冊 System.DirectoryServices.dll 元件。
    2. 註冊 MyAssembly 元件。
    3. 建立 MyDateTime 資料類型。
    4. 建立與 MyTable 資料表具有相同資料表結構的新資料表。
  5. 執行下列 INSERT ...要填入 MyTable 資料表的 SELECT 語句:

    INSERT INTO MyTable SELECT c1 FROM TempTable;
    

參考資料