MSSQLSERVER_6522

適用対象:SQL Server

詳細

属性
製品名 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

説明」セクションのシナリオ 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.Data.Entity.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. -n スイッチと共に Bcp.exe ユーティリティを使用して、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. -n スイッチと共に Bcp.exe ユーティリティを使用して、ファイルから 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 ...SELECT ステートメントを実行して、TempTable テーブルにデータを入力します。

    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 ...SELECT ステートメントを実行して、MyTable テーブルにデータを入力します。

    INSERT INTO MyTable SELECT c1 FROM TempTable;
    

リファレンス