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 公用程式
使用 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 。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應