Richtlinien zum Entwerfen von benutzerdefinierten Funktionen

Eine benutzerdefinierte Funktion wird als Datenbankobjekt gespeichert, wodurch wiederverwendbarer Code bereitgestellt wird, der auf folgende Weise verwendet werden kann:

  • In Transact-SQL-Anweisungen, wie z. B. SELECT

  • In Anwendungen, die die Funktion aufrufen

  • Bei der Definition einer anderen benutzerdefinierten Funktion

  • Zum Parametrisieren einer Sicht oder zur Verbesserung der Funktionalität einer indizierten Sicht

  • Zum Definieren einer Spalte in einer Tabelle

  • Zum Definieren einer CHECK-Einschränkung für eine Spalte

  • Zum Ersetzen einer gespeicherten Prozedur

Auswählen des Funktionstyps

Beim Entwerfen einer benutzerdefinierten Funktion ermitteln Sie zuerst den Typ der Funktion, der für Ihren Bedarf am besten geeignet ist. Was ist für die Funktion vorgesehen?

  • Rückgeben eines Skalarwerts (Einzelwert)

  • Rückgeben einer Tabelle (mehrere Zeilen)

  • Ausführen einer komplexen Berechnung

  • In erster Linie Zugreifen auf SQL Server-Daten

Benutzerdefinierte Funktionen, die entweder in Transact-SQL oder .NET Framework geschrieben sind, können sowohl Skalarwerte als auch Tabellenwerte zurückgeben.

Eigenschaften von Funktionen

Benutzerdefinierte Funktionen weisen eine Reihe von Eigenschaften auf, mit denen festgelegt wird, ob SQL Server Database Engine (Datenbankmodul) die Ergebnisse der Funktion indizieren kann – entweder durch Indizes für berechnete Spalten, die die Funktion aufrufen, oder durch indizierte Sichten, die auf die Funktion verweisen. Diese Eigenschaften sind auch auf Methoden von CLR-benutzerdefinierten Typen anwendbar.

Determinismus (Determinism)

Deterministische Funktionen geben bei jedem Aufrufen dasselbe Ergebnis zurück, wenn sie mit einem bestimmten Set von Eingabewerten aufgerufen werden und wenn die Datenbank dabei denselben Status hat. Nicht deterministische Funktionen können bei jedem Aufrufen unterschiedliche Ergebnisse zurückgeben, wenn sie mit einem bestimmten Set von Eingabewerten aufgerufen werden – selbst wenn die Datenbank, auf die zugegriffen wird, immer denselben Status hat.

Database Engine (Datenbankmodul) analysiert automatisch den Hauptteil von Transact-SQL-Funktionen und bewertet dabei, ob die Funktion deterministisch ist. Wenn die Funktion z. B. andere Funktionen aufruft, die nicht deterministisch sind, oder die Funktion erweiterte gespeicherte Prozeduren aufruft, markiert Database Engine (Datenbankmodul) die Funktion als nicht deterministisch. Bei CLR-Funktionen (Common Language Runtime) beruft Database Engine (Datenbankmodul) sich auf den Autor der Funktion, um die Funktion als deterministisch oder nicht deterministisch zu markieren, und verwendet dabei das benutzerdefinierte SqlFunction-Attribut.

Genauigkeit (Precision)

Eine benutzerdefinierte Funktion gilt als genau, wenn sie keine Gleitkommaoperationen verwendet.

Database Engine (Datenbankmodul) analysiert automatisch den Hauptteil von Transact-SQL-Funktionen und bewertet dabei, ob die Funktion genau ist. Bei CLR-Funktionen beruft sich Database Engine (Datenbankmodul) auf den Autor der Funktion, um die Funktion als genau oder nicht genau zu markieren, und verwendet dabei das benutzerdefinierte SqlFunction-Attribut.

Datenzugriff (Data Access)

Diese Eigenschaft gibt an, ob die Funktion mit dem in Bearbeitung befindlichen verwalteten SQL Server-Anbieter auf den lokalen Datenbankserver zugreift. Weitere Informationen finden Sie unter Datenzugriff von CLR-Datenbankobjekten aus.

Database Engine (Datenbankmodul) analysiert automatisch den Hauptteil von Transact-SQL-Funktionen und bewertet dabei, ob die Funktion einen Datenzugriff ausführt. Bei CLR-Funktionen beruft Database Engine (Datenbankmodul) sich auf den Autor der Funktion, um die Datenzugriffsmerkmale der Funktion anzugeben, und verwendet dabei das benutzerdefinierte SqlFunction-Attribut. Diese Eigenschaft wird zum Ausführungszeitpunkt durch Database Engine (Datenbankmodul) erzwungen. Wenn die Funktion angibt, dass DataAccess = None ist (Datenzugriff = Kein), die Funktion jedoch einen Datenzugriff durchführt, schlägt die Funktion zum Ausführungszeitpunkt fehl.

Systemdatenzugriff (System Data Access)

Diese Eigenschaft gibt an, ob die Funktion mit dem in Bearbeitung befindlichen verwalteten SQL Server-Anbieter auf die Systemmetadaten auf dem lokalen Datenbankserver zugreift.

Database Engine (Datenbankmodul) analysiert automatisch den Hauptteil von Transact-SQL-Funktionen und bewertet dabei, ob die Funktion einen Systemdatenzugriff ausführt. Bei CLR-Funktionen beruft Database Engine (Datenbankmodul) sich auf den Autor der Funktion, um die Systemdaten-Zugriffsmerkmale der Funktion anzugeben, und verwendet dabei das benutzerdefinierte SqlFunction-Attribut. Diese Eigenschaft wird zum Ausführungszeitpunkt durch Database Engine (Datenbankmodul) erzwungen. Wenn die Funktion angibt, dass SystemDataAccess = None ist (Systemdatenzugriff = Kein), die Funktion jedoch einen Systemdatenzugriff durchführt, schlägt die Funktion zum Ausführungszeitpunkt fehl.

Ist vom System überprüft (IsSystemVerified)

Diese Eigenschaft gibt an, ob die Determinismus- und Genauigkeitseigenschaften der Funktion durch Database Engine (Datenbankmodul) überprüfbar sind. Diese Eigenschaft gilt für Transact-SQL-Funktionen als erfüllt (true), so lange sie keine Funktionen aufrufen, die als IsSystemVerified = false markiert sind. Die Eigenschaft gilt für CLR-Funktionen als false.

Database Engine (Datenbankmodul) leitet die IsSystemVerified-Eigenschaft für Funktionen automatisch ab. Wenn Transact-SQL-Funktionen auf Funktionen zugreifen, die als IsSystemVerified = false markiert sind, wird diese Funktion selbst auch als IsSystemVerified = false markiert.

Weitere Informationen zu Funktionen in indizierten berechneten Spalten und indizierten Sichten finden Sie unter Erstellen von Indizes für berechnete Spalten und Erstellen von indizierten Sichten.