Partilhar via


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 atender a esses requisitos, você poderá aproveitar ao máximo as agregações definidas 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 User-Defined CLR.

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 de agregação 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 CREATE AGGREGATE instrução . Para obter mais informações, consulte Mapeamento de 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 de agregação. 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 de agregação. 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 de agregação 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 agregações e retorna o resultado da agregação. O return_type deve ser um tipo de dados SQL Server gerenciado que seja o equivalente gerenciado de return_sqltype especificado na CREATE AGGREGATE instrução . O return_type também pode 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 fornecem funcionalidade semelhante às matrizes de parâmetros, mas oferecem maior flexibilidade e maior integração com o Transact-SQL. Eles também fornecem o potencial para 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 gerenciado ou uma função em execução no processo de SQL Server. Além disso, TVPs não podem ser usados dentro do escopo de uma conexão de contexto. No entanto, um TVP pode ser usado com SqlClient em procedimentos armazenados gerenciados ou funções em execução no processo de SQL Server, se for usado em uma conexão que não seja uma conexão 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 Usar parâmetros de Table-Valued (Mecanismo de Banco de Dados).

Histórico de alterações

Conteúdo atualizado
Atualizada a descrição do método Accumulate; agora ele aceita mais de um parâmetro.

Consulte Também

Tipos definidos pelo usuário de CLR
Invocando funções de agregação CLR definidas pelo usuário