MSSQLSERVER_6522
適用対象: SQL サーバー
詳細
属性 | Value |
---|---|
製品名 | SQL Server |
イベント ID | 6522 |
イベント ソース | MSSQLSERVER |
コンポーネント | SQLEngine |
シンボル名 | SQLCLR_UDF_EXEC_FAILED |
メッセージ テキスト | ユーザー定義ルーチンまたは集計 "%.*ls" の実行中に .NET Framework エラーが発生しました: %ls。 |
説明
次のシナリオで考えてみましょう。
シナリオ 1
Microsoft .NET Framework アセンブリを参照する共通言語ランタイム (CLR) ルーチンを作成します。 .NET Framework アセンブリは 922672 には記載されていません。 次に、.NET Framework 3.5 または .NET Framework 2.0 ベースの修正プログラムをインストールします。
シナリオ 2
アセンブリを作成し、そのアセンブリを SQL Server データベースに登録します。 次に、そのアセンブリの別のバージョンをグローバル アセンブリ キャッシュ (GAC) にインストールします。
CLR ルーチンを実行するか、SQL Server でこれらのシナリオのいずれかからアセンブリを使用すると、次のようなエラー メッセージが表示されます。
サーバー: メッセージ 6522、レベル 16、状態 2、行 1
ユーザー定義ルーチンまたは集計 'getsid' の実行中に .NET Framework エラーが発生しました:System.IO.FileLoadException: ファイルまたはアセンブリ 'System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' またはその依存関係の 1 つを読み込めませんでした。 ホスト ストア内のアセンブリには、GAC 内のアセンブリとは異なるシグネチャがあります。 (HRESULT からの例外: 0x80131050)
考えられる原因
CLR によってアセンブリが読み込まれると、CLR では同じアセンブリが GAC 内にあることを確認します。 同じアセンブリが GAC 内にある場合、CLR ではこれらのアセンブリのモジュール バージョン ID (MVID) が一致することを確認します。 これらのアセンブリの MVID が一致しない場合は、「説明」セクションに記載されているエラー メッセージが表示されます。
アセンブリが再コンパイルされると、そのアセンブリの MVID が変わります。 したがって、.NET Framework を更新した場合、.NET Framework アセンブリは再コンパイルされるため、それらのアセンブリの MVID は異なります。 また、独自のアセンブリを更新した場合、そのアセンブリは再コンパイルされます。 したがって、そのアセンブリの MVID も異なります。
ユーザー アクション
Action1
Explanation セクションのシナリオ 1 を回避するには、SQL Server で .NET Framework アセンブリを手動で更新する必要があります。 これを行うには、ALTER ASSEMBLY
ステートメントを使用して、次のフォルダーにある .NET Framework アセンブリの新しいバージョンをポイントします。
%Windir%\Microsoft.NET\Framework\Version
Note
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 ユーティリティを使用する
-n スイッチと共に Bcp.exe ユーティリティを使用して、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 テーブルと同じテーブル構造を持つ新しいテーブルを作成します。
-n スイッチと共に Bcp.exe ユーティリティを使用して、ファイルから 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 を参照してください。