共用方式為


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。

使用者動作

Action 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;
    

參考資料