SQL Server wird mit einer Sammlung integrierter Funktionen geliefert, mit denen Sie eine Vielzahl von Vorgängen ausführen können. Jede integrierte Funktion dient einem bestimmten Zweck und kann nicht geändert werden. Wenn eine Funktion Ihren Zweck erfüllt, können Sie sie verwenden.
Aber was ist, wenn Sie keine Funktion finden, die Ihrem Zweck dient?
Dann ist es an der Zeit, Ihre eigene benutzerdefinierte Funktion zu schreiben.
Was ist eine benutzerdefinierte Funktion?
Eine benutzerdefinierte Funktion (UDF) ist eine Routine, die Parameter annehmen, Berechnungen oder andere Aktionen ausführen und ein Ergebnis zurückgeben kann. Und wie der Name schon sagt, wird es vom Benutzer definiert und erstellt. In diesem Fall ist der „Benutzer“ der SQL-Programmierer, DBA oder wer auch immer die Funktion geschrieben hat.
Der Begriff benutzerdefinierte Funktion unterscheidet sie von den integrierten Funktionen, die mit SQL Server ausgeliefert werden.
Sie können angeben, ob die UDF Parameter akzeptiert oder nicht, und wenn ja, deren Namen, Datentypen usw. Beispielsweise könnten Sie eine UDF schreiben, die eine Produkt-ID als Argument akzeptiert. Die Funktion kann dies dann in ihrer Berechnung verwenden. Das bedeutet, dass die Ausgabe der Funktion von der Eingabe abhängt, die ihr zugeführt wird, wenn sie aufgerufen wird.
Nachdem eine UDF erstellt wurde, kann sie aufgerufen werden.
Aufrufen einer benutzerdefinierten Funktion
Der Code innerhalb der Funktion wird nicht ausgeführt, wenn die Funktion erstellt wird. Sie wird nur ausgeführt, wenn die Funktion aufgerufen wird .
Das „Aufrufen“ einer Funktion wird manchmal als „Aufrufen“ einer Funktion bezeichnet. Dies ist, wenn Sie die Funktion dazu bringen, das zu tun, wofür sie gemacht wurde. Im Grunde erstellen Sie eine Funktion, und dann sitzt sie einfach da und wartet darauf, aufgerufen zu werden.
Sie können eine UDF aus Ihrem T-SQL-Code aufrufen, genau wie Sie eine Systemfunktion aufrufen würden. Beispielsweise könnten Sie eine UDF in einem WHERE
verwenden -Klausel, um die Ergebnisse eines SELECT
einzugrenzen Erklärung. Sie können es auch in der Liste der zurückzugebenden Spalten verwenden.
UDFs können auch in berechneten Spalten verwendet werden. Dies kann praktisch sein, wenn Sie jemals eine berechnete Spalte benötigen, um auf Daten in einer anderen Spalte zuzugreifen.
Parameter
Eine benutzerdefinierte Funktion kann bis zu 1024 Eingabeparameter akzeptieren. Sie können aber bei Bedarf auch eine Funktion ohne Parameter definieren.
Ein Beispiel für eine eingebaute Funktion ohne Parameter ist GETDATE()
. Diese Funktion gibt einfach den aktuellen Zeitstempel des Datenbanksystems zurück. Dafür müssen keine Parameter übergeben werden.
Ein Beispiel für eine benutzerdefinierte Funktion mit einem einzigen Parameter könnte eine sein, die die Kontaktdaten eines Kunden basierend auf der Kunden-ID zurückgibt. Beim Aufruf der Funktion übergeben Sie die Kunden-ID als Parameter an die Funktion. Die Funktion kann dann die Kundendetails nachschlagen und sie in der Rückgabevariablen zurückgeben. Wenn Sie die ID eines anderen Kunden übergeben, gibt die Funktion die Details für diesen Kunden zurück.
Vorteile benutzerdefinierter Funktionen
Einige der Hauptvorteile von UDFs umfassen die folgenden.
- Modulare Programmierung
- UDFs ermöglichen es Ihnen, Code einmal zu schreiben und ihn dann so oft wie nötig aufzurufen. Sie müssen nicht jedes Mal denselben Code neu schreiben, wenn Sie dasselbe tun müssen. Rufen Sie stattdessen einfach die Funktion auf. Das ist auch von Vorteil, wenn sich etwas ändert. Sie müssen es nur an einer Stelle aktualisieren – der Funktion. Wenn Sie die Funktion nicht verwendet haben, müssen Sie sie an mehreren Stellen in Ihrer Anwendung aktualisieren.
- Leistung
- UDFs reduzieren die Kompilierungskosten des T-SQL-Codes, indem die Pläne zwischengespeichert und für wiederholte Ausführungen wiederverwendet werden. Die UDF muss nicht bei jeder Verwendung erneut analysiert und optimiert werden. Dies führt zu viel schnelleren Ausführungszeiten.
- Reduzierter Netzwerkverkehr
- Eine Operation, die Daten basierend auf einer komplexen Einschränkung filtert, die nicht in einem einzelnen Skalarausdruck ausgedrückt werden kann, kann als Funktion ausgedrückt werden. Die Funktion kann dann im
WHERE
aufgerufen werden -Klausel, um die Anzahl der an den Client gesendeten Zeilen zu reduzieren.
UDFs können auch andere, spezifischere Vorteile haben, wie im vorherigen Beispiel, das ich mit der berechneten Spalte erwähnt habe, die auf Daten in einer anderen Tabelle zugreift.
Arten benutzerdefinierter Funktionen
Es gibt zwei Arten von benutzerdefinierten T-SQL-Funktionen:
- Skalarfunktionen
- Benutzerdefinierte Skalarfunktionen geben einen einzelnen Datenwert zurück. Den Typ des Werts legen Sie in der Funktion fest. Der Rückgabetyp kann ein beliebiger Datentyp außer Text sein , ntext , Bild , Cursor und Zeitstempel .
- Tabellenwertfunktionen
- Tabellenwertfunktionen (TVFs) geben eine Tabelle zurück. Ihr Rückgabetyp ist daher table . Es gibt zwei Arten von TVF:Inline-TVF und Multi-Statement-TVF. Ein Inline-TVF hat keinen Funktionsrumpf. Seine Rückgabetabelle ist das Ergebnis eines einzelnen
SELECT
Erklärung. Ein Multi-Anweisungs-TVF hingegen hat einen Funktionsrumpf. Bei TVFs mit mehreren Anweisungen geben Sie die Struktur der Tabelle in der Rückgabevariable an.
Sie können Skalar- und Tabellenwertfunktionen auch als benutzerdefinierte Common Language Runtime (CLR)-Funktionen erstellen.
Beginnend mit SQL Server 2005 (9.x) können Sie benutzerdefinierte Funktionen in jeder Microsoft .NET Framework-Programmiersprache wie Microsoft Visual Basic .NET oder Microsoft Visual C# schreiben.