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 公用程式
使用 Bcp.exe 公用程式搭配 -n 參數,將數據從 MyTable 數據表複製到檔案中。 例如,在命令提示字元中執行下列命令:
bcp MyDatabase.dbo.MyTable out C:\MyFile.bcp -n -SSQLServerName -T
在 SQL Server Management Studio 中,遵循下列步驟:
- 卸除 MyTable 資料表。
- 卸除 MyDateTime 資料類型。
- 卸除
System.DirectoryServices.dll
元件。 - 卸除 MyAssembly 元件。
在 SQL Server Management Studio 中,遵循下列步驟:
System.DirectoryServices.dll
註冊元件。- 註冊 MyAssembly 元件。
- 建立 MyDateTime 資料類型。
- 建立與 MyTable 數據表具有相同數據表結構的新數據表。
使用 Bcp.exe 公用程式搭配 -n 參數,將數據從檔案匯入 MyTable 數據表。 例如,在命令提示字元中執行下列命令:
bcp MyDatabase.dbo.MyTable in C:\MyFile.bcp -n -SSQLServerName -T
方法 2:使用 INSERT ...SELECT 語句
假設 MyDateTime 資料類型在記憶體中佔用 9 個字節。
在 SQL Server Management Studio 中,執行下列語句,建立包含
VARBINARY(9)
數據類型數據行的新數據表:CREATE TABLE TempTable (c1 VARBINARY(9));
執行下列 INSERT ...要填入 TempTable 數據表的 SELECT 語句:
INSERT INTO TempTable SELECT CAST(c1 as VARBINARY(9)) FROM MyTable;
在 SQL Server Management Studio 中,遵循下列步驟:
- 卸除 MyTable 資料表。
- 卸除 MyDateTime 資料類型。
- 卸除System.DirectoryServices.dll元件。
- 卸除 MyAssembly 元件。
在 SQL Server Management Studio 中,遵循下列步驟:
- 註冊System.DirectoryServices.dll元件。
- 註冊 MyAssembly 元件。
- 建立 MyDateTime 資料類型。
- 建立與 MyTable 數據表具有相同數據表結構的新數據表。
執行下列 INSERT ...要填入 MyTable 數據表的 SELECT 語句:
INSERT INTO MyTable SELECT c1 FROM TempTable;
參考資料
- 如需元件版本的詳細資訊,請參閱 Visual Studio 2005已淘汰的檔。
- 如需如何更新元件的詳細資訊,請參閱 ALTER ASSEMBLY (Transact-SQL) 。
- 如需如何卸除元件的詳細資訊,請參閱 DROP ASSEMBLY (Transact-SQL) 。
- 如需如何在 SQL Server 資料庫中註冊元件的詳細資訊,請參閱 CREATE ASSEMBLY (Transact-SQL) 。
- 如需Bcp.exe公用程式的詳細資訊,請參閱 https://msdn2.microsoft.com/library/ms162802.aspx。