CREATE AGGREGATE (Transact-SQL)

Dotyczy:SQL ServerAzure SQL Managed Instance

Tworzy funkcję agregatora zdefiniowaną przez użytkownika, której implementacja jest zdefiniowana w klasie asembla w ramach .NET Framework. Aby Database Engine powiązał funkcję agregatora z implementacją, assembler .NET Framework zawierający implementację musi zostać najpierw przesłany do instancji SQL Server za pomocą CREATE ASSEMBLY instrukcji.

Transact-SQL konwencje składni

Składnia

  
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 }  
  

Arguments

schema_name
To nazwa schematu, do którego należy funkcja agregatu zdefiniowana przez użytkownika.

aggregate_name
To nazwa funkcji agregacyjnej, którą chcesz stworzyć.

@ param_name
Jeden lub więcej parametrów w agregcie zdefiniowanym przez użytkownika. Wartość parametru musi być dostarczona przez użytkownika podczas wykonywania funkcji agregatu. Określ nazwę parametru, używając znaku "at" (@) jako pierwszego znaku. Nazwa parametru musi być zgodna z regułami identyfikatorów. Parametry są lokalne dla funkcji.

system_scalar_type
Czy którykolwiek z skalarnych typów danych systemu SQL Server przechowuje wartość parametru wejściowego lub zwracanej wartości? Wszystkie typy danych skalarnych mogą być używane jako parametr dla agregatu zdefiniowanego przez użytkownika, z wyjątkiem tekstu, ntextu i obrazu. Nie można określić typów nieskalarnych, takich jak kursor i tabela.

udt_schema_name
To nazwa schematu, do którego należy użytkownik CLR typu zdefiniowanego przez użytkownika. Jeśli nie jest to określone, Database Engine odniesienia udt_type_name w następującej kolejności:

  • Natywna przestrzeń nazw typów SQL.

  • Domyślny schemat bieżącego użytkownika w bieżącej bazie danych.

  • Schemat dbo w bieżącej bazie danych.

udt_type_name
To nazwa użytkownika zdefiniowanego przez użytkownika typu CLR już utworzonego w aktualnej bazie danych. Jeśli udt_schema_name nie jest określona, zakłada SQL Server typ należy do schematu aktualnego użytkownika.

assembly_name [ .class_name ]
Określa asemble, który ma się wiązać z funkcją agregatora zdefiniowaną przez użytkownika, a opcjonalnie nazwę schematu, do którego należy asembler, oraz nazwę klasy w asemblerze, która implementuje agregat zdefiniowany przez użytkownika. Asembl musi już zostać utworzony w bazie danych za pomocą CREATE ASSEMBLY instrukcji. class_name musi być ważnym identyfikatorem SQL Server i odpowiadać nazwie klasy istniejącej w asemblerze. class_name może być nazwą kwalifikowaną dla przestrzeni nazw, jeśli język programowania używany do zapisu klasy używa przestrzeni nazw, takich jak C#. Jeśli class_name nie jest określone, SQL Server zakłada, że jest to to samo co aggregate_name.

Remarks

Domyślnie możliwość uruchamiania kodu CLR przez program SQL Server jest wyłączona. Możesz tworzyć, modyfikować i usuwać obiekty bazy danych, które odwołują się do zarządzanych modułów kodu, ale kod w tych modułach nie uruchomi się w instancji SQL Server, chyba że opcja CLR jest włączona przez sp_configure.

Klasa asemblera, do którego się odwołuje assembly_name oraz jej metody, powinny spełniać wszystkie wymagania implementacji funkcji agregującej zdefiniowanej przez użytkownika w instancji SQL Server. Więcej informacji można znaleźć w artykule CLR User-Defined Agregaty.

Permissions

Wymaga CREATE AGGREGATE zezwolenia oraz REFERENCJI na asemblerze, które jest określone w klauzuli EXTERNAL NAME.

Examples

Poniższy przykład zakłada, że skompilowana jest przykładowa aplikacja StringUtilities.csproj. Więcej informacji można znaleźć w Przykładzie funkcji narzędzi łańcuchowych.

Przykład tworzy agregat Concatenate. Przed utworzeniem agregatu, asembl StringUtilities.dll jest rejestrowany w lokalnej bazie danych.

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  

Zobacz też

DROP AGGREGATE (Transact-SQL)