Share via


CLR ユーザー定義集計の要件

CLR (共通言語ランタイム) アセンブリの型は、必要な集計コントラクトが実装されていれば、ユーザー定義集計関数として登録できます。このコントラクトは、SqlUserDefinedAggregate 属性と集計コントラクトのメソッドで構成されます。集計コントラクトには、集計の中間状態を保存するためのメカニズムと、Init、Accumulate、Merge、および Terminate の 4 つのメソッドで構成される新しい値を積算するメカニズムが含まれます。これらの要件を満たしていれば、ユーザー定義集計の豊富なメリットを Microsoft SQL Server で有効に活用できます。このトピックの次のセクションでは、ユーザー定義集計を作成し、そのユーザー定義集計を使用して作業する方法について詳しく説明します。例については、「CLR ユーザー定義集計関数の呼び出し」を参照してください。

SqlUserDefinedAggregate

詳細については、「SqlUserDefinedAggregateAttribute」を参照してください。

集計のメソッド

ユーザー定義集計として登録するクラスでは、次のインスタンス メソッドをサポートする必要があります。次に、集計を計算するためにクエリ プロセッサで使用されるメソッドを示します。

メソッド

構文

説明

Init

public void Init();

クエリ プロセッサは、このメソッドを使用して集計計算を初期化します。このメソッドは、クエリ プロセッサで集計されるグループごとに 1 回ずつ呼び出されます。クエリ プロセッサでは、複数のグループの集計を計算するために、集計クラスの同じインスタンスの再利用を選択することがあります。Init メソッドは、現在のインスタンスが以前に使用されていれば必要になるクリーンアップを実行し、新たな集計計算を再開できるようにします。

Accumulate

public void Accumulate ( input-type value[, input-type value, ...]);

関数のパラメーターを表す 1 つ以上のパラメーター。input_type には、CREATE AGGREGATE ステートメントで input_sqltype により指定された SQL Server ネイティブ データ型に相当する SQL Server マネージ データ型を指定する必要があります。詳細については、「CLR パラメーター データのマッピング」を参照してください。

UDT (ユーザー定義型) の場合、input-type 型は UDT 型と同じです。クエリ プロセッサでは、このメソッドを使用して集計値を積算します。このメソッドは、集計されるグループの値ごとに 1 回ずつ呼び出されます。クエリ プロセッサでは、集計クラスの特定のインスタンスの Init メソッドが呼び出された後にのみ、常に、このメソッドが呼び出されます。このメソッドの実装では、渡された引数値の積算を反映してインスタンスの状態を更新する必要があります。

Merge

public void Merge( udagg_class value);

このメソッドは、この集計クラスの別のインスタンスを現在のインスタンスとマージする場合に使用できます。クエリ プロセッサでは、このメソッドを使用して、1 つの集計の複数の部分計算をマージできます。

Terminate

public return_type Terminate();

このメソッドは、集計計算を完了し、集計の結果を返します。return_type には、CREATE AGGREGATE ステートメントで指定された return_sqltype のマネージ データ型に相当する SQL Server マネージ データ型を指定する必要があります。また、return_type には、ユーザー定義型を指定することもできます。

テーブル値パラメーター

テーブル値パラメーター (TVP) とは、プロシージャや関数に渡されるユーザー定義のテーブル型です。TVP を使用すると、複数行のデータを効率的にサーバーに渡すことができます。TVP の機能はパラメーター配列に似ていますが、より柔軟性が高く、Transact-SQL との統合も緊密です。TVP を使用するとパフォーマンスが向上する可能性もあります。また、サーバーへのラウンド トリップを減らすのにも役立ちます。スカラー パラメーターのリストを使用するなどしてサーバーに複数の要求を送信する代わりに、データを TVP としてサーバーに送信できます。SQL Server のプロセスで実行されているマネージ ストアド プロシージャやマネージ関数にユーザー定義のテーブル型をテーブル値パラメーターとして渡したり、戻り値として受け取ったりすることはできません。また、TVP はコンテキスト接続のスコープ内では使用できません。ただし、コンテキスト接続ではない接続で使用されている SqlClient を使用すると、SQL Server のプロセスで実行されているマネージ ストアド プロシージャやマネージ関数で TVP を使用できます。その接続は、マネージ プロシージャやマネージ関数を実行しているのと同じサーバーへの接続でかまいません。TVP の詳細については、「テーブル値パラメーター (データベース エンジン)」を参照してください。