Requisitos para agregações CLR definidas pelo usuário

Um tipo em um assembly do CLR pode ser registrado como uma função de agregação definida pelo usuário, desde que implemente o contrato de agregação necessário. Esse contrato consiste no atributo SqlUserDefinedAggregate e os métodos de contrato de agregação. O contrato de agregação inclui o mecanismo para salvar o estado intermediário da agregação e o mecanismo para acumular novos valores, o qual consiste em quatro métodos: Init, Accumulate, Merge e Terminate. Quando você tiver atendido esses requisitos, será capaz de tirar o máximo proveito dos agregados definidos pelo usuário no Microsoft SQL Server. As seguintes seções deste tópico fornecem detalhes adicionais sobre como criar e trabalhar com agregações definidas pelo usuário. Para obter um exemplo, consulte Invocando funções de agregação CLR definidas pelo usuário.

SqlUserDefinedAggregate

Para obter mais informações, consulte SqlUserDefinedAggregateAttribute.

Métodos de agregação

A classe registrada como uma agregação definida pelo usuário deve dar suporte aos seguintes métodos de instância. Eles são os métodos que o processador de consultas usa para computar a agregação:

Método

Sintaxe

Descrição

Init

public void Init();

O processador de consultas usa esse método para inicializar a computação da agregação. Ele é invocado uma vez para cada grupo que o processador de consultas está agregando. O processador de consultas pode optar por reutilizar a mesma instância da classe agregada para computar agregações de grupos vários. O método Init deve executar qualquer limpeza, conforme necessário, de usos anteriores desta instância e habilitá-la para que uma nova computação de agregação seja reiniciada.

Accumulate

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

Um ou mais parâmetros que representam os parâmetros da função. input_type deve ser o tipo de dados SQL Server gerenciado equivalente ao tipo de dados SQL Server nativo especificado por input_sqltype na instrução CREATE AGGREGATE. Para obter mais informações, consulte Mapeando dados de parâmetro CLR.

Para UDTs (tipos definidos pelo usuário), o tipo de entrada é o mesmo que o tipo do UDT. O processador de consultas usa esse método para acumular os valores agregados. Ele é invocado uma vez para obter cada valor no grupo que está sendo agregado. O processador de consultas o chama somente depois de chamar o método Init na instância determinada da classe-agregada. A implementação desse método deve atualizar o estado da instância para refletir o acúmulo do valor do argumento que é passado.

Merge

public void Merge( udagg_class value);

Esse método pode ser usado para mesclar outra instância desta classe agregada com a instância atual. O processador de consultas usa esse método para mesclar várias computações parciais de uma agregação.

Terminate

public return_type Terminate();

Esse método completa a computação de agregados e retorna o resultado da agregação. O return_type deve ser um tipo de dados gerenciados SQL Server que é o equivalente gerenciado de return_sqltype especificado na instrução CREATE AGGREGATE. O return_type também podem ser um tipo definido pelo usuário.

Parâmetros com valor de tabela

Os TVPs (parâmetros com valor de tabela), ou seja, tipos de tabela definidos pelo usuário transmitidos para um procedimento ou uma função, oferecem uma maneira eficiente de passar várias linhas de dados para o servidor. Os TVPs proporcionam funcionalidade semelhante para matrizes de parâmetro, porém com maior flexibilidade e integração com Transact-SQL. Também garantem o potencial de melhor desempenho. Os TVPs também ajudam a reduzir o número de viagens de ida e volta para o servidor. Em vez de enviar várias solicitações ao servidor, como com uma lista de parâmetros escalares, os dados podem ser enviados ao servidor como um TVP. Um tipo de tabela definido pelo usuário não pode ser passado como um parâmetro com valor de tabela para, ou ser retornado de, um procedimento armazenado ou uma função gerenciada(o) que é executada(o) no processo do SQL Server. Além disso, TVPs não podem ser usados dentro do escopo de uma conexão de contexto. Entretanto, um TVP pode ser usado com o SqlClient nos procedimentos armazenados gerenciados ou nas funções em execução no processo do SQL Server, se for usado em uma conexão que não seja de contexto. A conexão pode ser com o mesmo servidor que está executando o procedimento ou função gerenciada. Para obter mais informações sobre TVPs, consulte Parâmetros com valor de tabela (Mecanismo de Banco de Dados).