分享方式:


CREATE AGGREGATE (Transact-SQL)

適用於:SQL Server Azure SQL 受控執行個體

建立使用者定義的彙總函式 (其實作定義在 .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 }  
  

引數

schema_name
這是使用者定義彙總函式所屬的結構描述名稱。

aggregate_name
這是您要建立之彙總函式的名稱。

@param_name
使用者定義彙總中的一或多個參數。 在執行彙總函式時,使用者必須提供參數的值。 使用 "at" 記號 ( @ ) 當作第一個字元來指定參數名稱。 參數名稱必須符合識別碼的規則。 這些參數是函數的本機參數。

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 一樣。

備註

根據預設,會關閉 SQL Server 執行 CLR 程式碼的能力。 您可以建立、修改和卸除參考受控碼模組的資料庫物件,但除非使用 sp_configure 來啟用 clr enabled 選項,否則這些模組中的程式碼不會在 SQL Server 執行個體中執行。

assembly_name 及其方法所參考的組件類別,應該滿足在 SQL Server 執行個體中實作使用者定義彙總函式的所有需求。 如需詳細資訊,請參閱 CLR 使用者定義彙總

權限

需要 CREATE AGGREGATE 權限,以及 EXTERNAL NAME 子句所指定之組件的 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)