CREATE AGGREGATE (Transact-SQL)

適用対象: SQL ServerAzure SQL Managed Instance

.NET Framework のアセンブリのクラスで実装が定義される、ユーザー定義集計関数を作成します。 データベース エンジンが集計関数を実装にバインドするには、先に CREATE ASSEMBLY ステートメントを使用して、その実装を含む .NET Framework アセンブリを SQL Server のインスタンスにアップロードしておく必要があります。

Transact-SQL 構文表記規則

構文

  
CREATE AGGREGATE [ schema_name . ] aggregate_name  
        (@param_name <input_sqltype>   
        [ ,...n ] )  
RETURNS <return_sqltype>  
EXTERNAL NAME assembly_name [ .class_name ]  
  
<input_sqltype> ::=  
        system_scalar_type | { [ udt_schema_name. ] udt_type_name }  
  
<return_sqltype> ::=  
        system_scalar_type | { [ udt_schema_name. ] udt_type_name }  
  

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

schema_name
ユーザー定義集計関数が所属しているスキーマの名前です。

aggregate_name
作成する集計関数の名前です。

@param_name
ユーザー定義集計で定義された 1 つまたは複数のパラメーター。 パラメーターの値は、集計関数の実行時にユーザーが指定する必要があります。 パラメーター名は、最初の文字を "アット" マーク ( @ ) にして指定します。 パラメーター名は識別子のルールに従っている必要があります。 パラメーターは関数に対してローカルです。

system_scalar_type
入力パラメーターの値または戻り値を保持する SQL Server システムのスカラーのデータ型です。 textntextimage 以外のすべてのスカラーのデータ型は、ユーザー定義集計のパラメーターとして使用できます。 cursortable など、スカラー型以外のデータ型は指定できません。

udt_schema_name
CLR ユーザー定義型が所属しているスキーマの名前です。 指定しない場合、データベース エンジンは次の順序で "udt_type_name" を参照します。

  • ネイティブ SQL 型の名前空間。

  • 現在のデータベースにおける現在のユーザーの既定のスキーマ。

  • 現在のデータベースの dbo スキーマ。

udt_type_name
現在のデータベースに既に作成されている CLR ユーザー定義型の名前です。 "udt_schema_name" を指定しない場合、SQL Server では、型は現在のユーザーのスキーマに所属すると見なされます。

assembly_name [ .class_name ]
ユーザー定義集計関数にバインドするアセンブリ、および必要に応じて、アセンブリが所属するスキーマの名前とユーザー定義集計を実装するアセンブリ内のクラス名を指定します。 アセンブリは、CREATE ASSEMBLY ステートメントを使用してデータベース内に作成されている必要があります。 "class_name" は有効な SQL Server 識別子でなければならず、アセンブリに存在するクラスの名前と一致する必要があります。 C# など、クラスを記述するのに使用するプログラミング言語で名前空間を使用する場合、class_name には名前空間で修飾された名前を指定できます。 "class_name" を指定しない場合は、SQL Server によって "aggregate_name" と同じであると見なされます。

解説

既定では、CLR コードを実行する SQL Server の機能はオフになっています。 マネージド コード モジュールを参照するデータベース オブジェクトを作成、変更、削除できますが、これらのモジュールのコードは、sp_configure を使用して clr enabled オプションを有効にしない限り SQL Server のインスタンスでは動作しません。

"assembly_name" とそのメソッドで参照されているアセンブリのクラスは、SQL Server のインスタンスでユーザー定義集計関数を実装するためのすべての要件を満たしている必要があります。 詳細については、「CLR ユーザー定義集計」を参照してください。

アクセス許可

EXTERNAL NAME 句で指定されているアセンブリ上に CREATE AGGREGATE 権限と REFERENCES 権限が必要です。

次の例は、StringUtilities.csproj サンプル アプリケーションがコンパイルされていることを前提としています。 詳細については、「文字列ユーティリティ関数サンプル」を参照してください。

この例は集計 Concatenate を作成します。 集計が作成される前に、アセンブリ StringUtilities.dll がローカル データベースに登録されます。

USE AdventureWorks2022;  
GO  
DECLARE @SamplesPath nvarchar(1024)  
-- You may have to modify the value of the this variable if you have  
--installed the sample some location other than the default location.  
  
SELECT @SamplesPath = REPLACE(physical_name, 'Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\master.mdf', 'Microsoft SQL Server\130\Samples\Engine\Programmability\CLR\')   
     FROM master.sys.database_files   
     WHERE name = 'master';  
  
CREATE ASSEMBLY StringUtilities FROM @SamplesPath + 'StringUtilities\CS\StringUtilities\bin\debug\StringUtilities.dll'  
WITH PERMISSION_SET=SAFE;  
GO  
  
CREATE AGGREGATE Concatenate(@input nvarchar(4000))  
RETURNS nvarchar(4000)  
EXTERNAL NAME [StringUtilities].[Microsoft.Samples.SqlServer.Concatenate];  
GO  

参照

DROP AGGREGATE (Transact-SQL)