次の方法で共有


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

CLR (共通言語ランタイム) アセンブリの型は、必要な集計コントラクトが実装されていれば、ユーザー定義集計関数として登録できます。 このコントラクトは、SqlUserDefinedAggregate 属性と集計コントラクト メソッドで構成されます。 集計コントラクトには、集計の中間状態を保存するメカニズムと、 InitAccumulateMergeTerminateの 4 つのメソッドで構成される新しい値を蓄積するメカニズムが含まれます。 これらの要件を満たすと、Microsoft SQL Server でユーザー定義集計を最大限に活用できるようになります。 このトピックの以降のセクションでは、ユーザー定義集計を作成して操作する方法について詳しく説明します。 例については、「 CLR User-Defined 集計関数の呼び出し」を参照してください。

SqlUserDefinedAggregate

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

集計メソッド

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

メソッド 構文 説明
Init public void Init(); クエリ プロセッサは、このメソッドを使用して集計計算を初期化します。 このメソッドは、クエリ プロセッサで集計されるグループごとに 1 回ずつ呼び出されます。 クエリ プロセッサは、複数のグループの集計を計算するために、集計クラスの同じインスタンスを再利用することを選択できます。 Initメソッドは、このインスタンスの以前の使用から必要に応じてクリーンアップを実行し、新しい集計計算を再開できるようにする必要があります。
Accumulate public void Accumulate (input-type value[, input-type value, ...]); 関数のパラメーターを表す 1 つ以上のパラメーター。 input_type は、 ステートメントで CREATE AGGREGATE によって指定されたネイティブ 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 と同等のマネージド SQL Server データ型である必要があります。 return_typeは、ユーザー定義型にすることもできます。

テーブル値パラメーター

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

変更履歴

変更内容
Accumulate メソッドの説明を更新しました。複数のパラメーターを受け入れるようになりました。

こちらもご覧ください

CLR User-Defined 型
CLR User-Defined 集計関数の呼び出し