Benutzerdefinierte Funktionen in Microsoft SQL Server

Richtig gerechnet

Mit SQL Server 2000 hat Microsoft zum ersten Mal eine Technik implementiert, die es ermöglicht, wiederkehrende Berechnungen und Abfragen in Funktionen zu kapseln. Dadurch ließen sich modulare Entwicklungswerkzeuge bereitstellen, die eine immer wiederkehrende Kodierung von Abfragen obsolet machten. Doch sorgten diese benutzerdefinierten Funktionen auch für eine hohe Serverlast. Erst mit SQL Server 2014 hat sich Microsoft dieses Problems angenommen. Wir beleuchten die benutzerdefinierten Funktionen und deren Auswirkungen auf den Server.
Cloud-First-Strategien sind inzwischen die Regel und nicht mehr die Ausnahme und Workloads verlagern sich damit in die Cloud – auch Datenbanken. Dort geht es ... (mehr)

Ebenso wie Funktionen in Programmiersprachen sind auch benutzerdefinierte Funktionen von SQL Server Routinen, die Parameter annehmen, eine Aktion ausführen (etwa eine komplexe Berechnung) und das Ergebnis dieser Aktion als Wert zurückgeben. Der Rückgabewert kann ein einzelner Skalarwert oder ein Resultset sein. Mit der Einführung von benutzerdefinierten Funktionen zog allerdings auch der Ärger der Datenbankadministratoren in die Geschäftsräume ein, da sie immer wieder beobachten mussten, wie die CPU-Auslastungen bei SQL-Servern an ihre Grenzen stießen oder dass eine hohe Last auf dem Storage lag. In vielen Fällen war die Ursache für diese Auslastung die Verwendung benutzerdefinierter Funktionen. Microsoft adressierte diese Problematik erst sehr spät mit SQL Server 2014.

Skalarfunktionen

Eine benutzerdefinierte Skalarfunktion gibt einen einzelnen Datenwert in einer RETURN-Klausel zurück. Bei einer Inline- Skalarfunktion ist der zurückgegebene Wert das Ergebnis einer einzelnen Anweisung. Bei einer aus mehreren Anweisungen bestehenden Skalarfunktion kann die Funktion mehrere Transact- SQL-Anweisungen enthalten, die im Ergebnis einen einzelnen Wert zurückgeben. Der Rückgabetyp kann ein beliebiger Datentyp mit Ausnahme von text, ntext, image, cursor und timestamp sein.

Eine Inline-Skalarfunktion besteht aus nur einem Statement, das einen Rückgabewert berechnet. Zum Beispiel soll für Auftragspositionen immer ein Gesamtpreis pro Position berechnet werden. Da diese Berechnung an vielen Stellen im Code stattfindet, entscheidet sich der Entwickler in unserem Beispiel für die Implementierung einer Skalarfunktion:

CREATE FUNCTION dbo.CalculatePrice ( @Quantity NUMERIC(10, 2), @Price SMALLMONEY
)
RETURNS SMALLMONEY
AS
BEGIN RETURN @Quantity * @Price
END
GO

In Abfragen kann dann die Funktion verwendet werden, die eine Kalkulation des Preises vornimmt

...

Der komplette Artikel ist nur für Abonnenten des ADMIN Archiv-Abos verfügbar.

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2021