CLR 関数の作成
適用対象 SQL Server 2016 (13.x) 以降のバージョン
SQL Server のインスタンス内部には、 Microsoft .NET Framework 共通言語ランタイム (CLR) で作成されたアセンブリでプログラミングされたデータベース オブジェクトを作成できます。 共通言語ランタイムが提供する豊富なプログラミング モデルを使用できるデータベース オブジェクトには、集計関数、関数、ストアド プロシージャ、トリガー、型などがあります。
SQL Server の CLR 関数を作成するには、次の手順に従います。
.NET Framework がサポートする言語のクラスの静的メソッドとして、関数を定義します。 共通言語ランタイムでの関数のプログラミング方法の詳細については、「 CLR ユーザー定義関数」を参照してください。 次に、適切な言語コンパイラを使用してクラスをコンパイルし、.NET Framework のアセンブリをビルドします。
CREATE ASSEMBLY ステートメントを使用して、SQL Server にアセンブリを登録します。 SQL Server のアセンブリの詳細については、「アセンブリ (データベース エンジン)」を参照してください。
CREATE FUNCTION ステートメントを使用して、登録したアセンブリを参照する関数を作成します。
SQL Server では、CLR コードの実行は既定でオフになっています。 マネージド コード モジュールを参照するデータベース オブジェクトを作成、変更、削除することはできますが、sp_configure (Transact-SQL) を使用して clr enabled オプション を有効にしないと、SQL Server では、これらの参照が実行されません。
Microsoft Visual Studio で SQL Server プロジェクトを配置すると、そのプロジェクトで指定されたデータベースにアセンブリが登録されます。 また、プロジェクトを配置することで、 SqlFunction 属性で注釈が付けられたすべてのメソッドの CLR 関数がデータベースに作成されます。 詳細については、「 CLR データベース オブジェクトの配置」を参照してください。
外部リソースにアクセスする
CLR 関数は、ファイル、ネットワーク リソース、Web サービス、他のデータベース (SQL Server のリモート インスタンスを含む) などの外部リソースへのアクセスに使用できます。 これは、 System.IO
、 System.WebServices
、System.Sql
など、.NET Framework のさまざまなクラスを使用して実現できます。 このためには、このような関数を含むアセンブリに、少なくとも EXTERNAL_ACCESS 権限セットを構成します。 詳細については、「CREATE ASSEMBLY (Transact-SQL)」を参照してください。 SQL Server のリモート インスタンスへのアクセスには、SQL クライアント マネージド プロバイダーを使用できます。 ただし、接続を開始したサーバーへのループバック接続は、CLR 関数ではサポートされていません。
SQL Server のアセンブリを作成、変更、削除するには
CLR 関数を作成するには
ネイティブ コードにアクセスする
CLR 関数では、マネージド コードから PInvoke
を使用することにより、C や C++ で記述されたコードなどのネイティブ (アンマネージド) コードにアクセスできます (詳細については、「マネージド コードからのネイティブ関数の呼び出し」を参照してください)。 これにより、レガシ コードを CLR UDF として再利用したり、パフォーマンス クリティカルな UDF をネイティブ コードで記述したりすることができ、また、UNSAFE アセンブリの使用を必須とすることができます。 UNSAFE アセンブリの使用に関する注意事項は、「 CLR 統合のコード アクセス セキュリティ 」を参照してください。