CLR 関数の作成
SQL Server のインスタンス内部には、Microsoft .NET Framework CLR (共通言語ランタイム) で作成されたアセンブリの形式でプログラミングされたデータベース オブジェクトを作成できます。 共通言語ランタイムが提供する豊富なプログラミング モデルを利用できるデータベース オブジェクトには、集計関数、関数、ストアド プロシージャ、トリガー、型などがあります。
SQL Server の CLR 関数を作成するには、次の手順に従います。
.NET Framework がサポートする言語のクラスの静的メソッドとして、関数を定義します。 共通言語ランタイムでの関数のプログラミング方法の詳細については、「CLR ユーザー定義関数」を参照してください。 次に、適切な言語コンパイラを使用してクラスをコンパイルし、.NET Framework のアセンブリをビルドします。
CREATE ASSEMBLY ステートメントを使用して、SQL Server にアセンブリを登録します。 SQL Server のアセンブリの詳細については、「アセンブリ (データベース エンジン)」を参照してください。
CREATE FUNCTION ステートメントを使用して、登録したアセンブリを参照する関数を作成します。
注 |
---|
Microsoft Visual Studio で SQL Server プロジェクトを配置すると、そのプロジェクトで指定されたデータベース内のアセンブリが登録されます。 また、プロジェクトを配置することで、SqlFunction 属性で注釈が付けられたすべてのメソッドの CLR 関数がデータベースに作成されます。 詳細については、「CLR データベース オブジェクトの配置」を参照してください。 |
注 |
---|
CLR コードを実行する SQL Server の機能は、既定では無効になっています。 マネージ コード モジュールを参照するデータベース オブジェクトを作成、変更、削除することはできますが、sp_configure (Transact-SQL) を使用して clr enabled オプションを有効にしないと、これらの参照は SQL Server で実行されません。 |
外部リソースへのアクセス
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 統合のコード アクセス セキュリティ」を参照してください。