Freigeben über


Anforderungen für benutzerdefinierte CLR-Aggregate

Ein Typ in einer CLR-Assembly (Common Language Runtime) kann als benutzerdefinierte Aggregatfunktion registriert werden, solange der erforderliche Aggregationsvertrag implementiert wird. Dieser Vertrag besteht aus dem SqlUserDefinedAggregate-Attribut und den Aggregationsvertragsmethoden. Der Aggregationsvertrag beinhaltet den Mechanismus zur Speicherung des Zwischenstatus der Aggregation sowie den Mechanismus zur Ansammlung neuer Werte, der sich aus den vier Methoden Init, Accumulate, Merge und Terminate zusammensetzt. Sind diese Anforderungen erfüllt, können Sie die Funktionalität der benutzerdefinierten Aggregate in MicrosoftSQL Server uneingeschränkt nutzen. Die folgenden Abschnitte zu diesem Thema enthalten zusätzliche Details zum Erstellen von benutzerdefinierten Aggregaten und zu ihrer Verwendungsweise. Ein Beispiel hierzu finden Sie unter Aufrufen von CLR-benutzerdefinierten Aggregatfunktionen.

SqlUserDefinedAggregate

Weitere Informationen finden Sie unter SqlUserDefinedAggregateAttribute.

Aggregationsmethoden

Die als benutzerdefiniertes Aggregat registrierte Klasse muss eine der folgenden Instanzmethoden unterstützen. Diese Methoden werden vom Abfrageprozessor verwendet, um die Aggregation zu berechnen:

Methode

Syntax

Beschreibung

Init

public void Init();

Der Abfrageprozessor verwendet diese Methode, um die Berechnung der Aggregation zu initialisieren. Diese Methode wird einmal für jede Gruppe aufgerufen, die der Abfrageprozessor aggregiert. Der Abfrageprozessor verwendet möglicherweise dieselbe Instanz der Aggregatklasse mehrfach, um Aggregate für mehrere Gruppen zu berechnen. Die Init-Methode sollte die nach der vorherigen Verwendung dieser Instanz gegebenenfalls erforderlichen Cleanups durchführen und den erneuten Start einer weiteren Aggregatberechnung ermöglichen.

Accumulate

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

Ein oder mehrere Parameter, die die Parameter der Funktion darstellen. input_type sollte der verwaltete SQL Server-Datentyp sein, der dem systemeigenen SQL Server-Datentyp entspricht, der durch input_sqltype in der CREATE AGGREGATE-Anweisung angegeben ist. Weitere Informationen finden Sie unter Zuordnen von CLR-Parameterdaten.

Für benutzerdefinierte Typen (User-Defined Types, UDTs) entspricht der Eingabetyp dem UDT-Typ. Der Abfrageprozessor verwendet diese Methode, um die Aggregatwerte zu sammeln. Sie wird einmal für jeden Wert in der zu aggregierenden Gruppe aufgerufen. Der Abfrageprozessor ruft diese Methode stets erst nach der Init-Methode für die jeweilige Instanz der Aggregatklasse auf. Durch die Implementierung dieser Methode wird der Instanzstatus auf den momentanen Stand der übergebenen Argumentwertansammlung aktualisiert.

Merge

public void Merge( udagg_class value);

Diese Methode kann verwendet werden, um eine andere Instanz dieser Aggregatklasse mit der aktuellen Instanz zusammenzuführen. Der Abfrageprozessor verwendet diese Methode, um mehrere Teilberechnungen einer Aggregation zusammenzuführen.

Terminate

public return_type Terminate();

Diese Methode schließt die Aggregatberechnung ab und gibt das Ergebnis der Aggregation zurück. return_type sollte ein verwalteter SQL Server-Datentyp sein und dem verwalteten return_sqltype entsprechen, der in der CREATE AGGREGATE-Anweisung angegeben ist. Der return_type kann auch ein benutzerdefinierter Typ sein.

Tabellenwertparameter

Tabellenwertparameter (Table Valued Parameters, TVPs), benutzerdefinierte Tabellentypen, die an eine Prozedur oder Funktion übergeben werden, bieten eine effiziente Methode zum Übergeben mehrerer Datenzeilen an den Server. TVPs verfügen über eine ähnliche Funktionalität wie Parameterarrays, bieten aber größere Flexibilität und engere Integration mit Transact-SQL. Sie besitzen auch ein besseres Leistungspotenzial. TVPs tragen außerdem dazu bei, die Anzahl von Roundtrips zum Server zu reduzieren. Anstatt mehrere Anfragen an den Server zu senden, z. B. mit einer Liste von skalaren Parametern, können Daten als TVP an den Server gesendet werden. Ein benutzerdefinierter Tabellentyp kann nicht als Tabellenwertparameter an eine verwaltete gespeicherte Prozedur oder Funktion übergeben werden, die im SQL Server-Prozess ausgeführt wird, oder von einer solchen Prozedur oder Funktion zurückgegeben werden. Auch können TVPs nicht innerhalb des Bereichs einer Kontextverbindung verwendet werden. Allerdings kann ein TVP, sofern er nicht als Kontextverbindung verwendet wird, mit SqlClient in verwalteten gespeicherten Prozeduren oder Funktionen verwendet werden, die im SQL Server-Prozess ausgeführt werden. Die Verbindung kann zum gleichen Server erfolgen, der die verwaltete Prozedur oder Funktion ausführt. Weitere Informationen zu Tabellenwertparametern finden Sie unter Tabellenwertparameter (Datenbankmodul).

Änderungsverlauf

Aktualisierter Inhalt

Es wurde die Beschreibung der Accumulate-Methode aktualisiert, die jetzt mehrere Parameter zulässt.