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

In Microsoft SQL Server 2005 wurden die benutzerdefinierten Funktionen erweitert, um Funktionen einzuschließen, die in einer beliebigen von Microsoft .NET Framework unterstützten Programmiersprache geschrieben wurden. Außerdem wurden einige Einschränkungen im Zusammenhang mit der Verwendung von nicht deterministischen Funktionen aufgehoben. Diese Änderungen wirken sich darauf aus, welche Auswahlmöglichkeiten Sie beim Entwerfen und Implementieren von benutzerdefinierten Funktionen haben.

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 Skalarwertes (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-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.

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 Datenbankmodul die Funktion als nicht deterministisch. Bei CLR-Funktionen (Common Language Runtime) beruft 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.

Datenbankmodul analysiert automatisch den Hauptteil von Transact-SQL-Funktionen und bewertet dabei, ob die Funktion genau ist. Bei CLR-Funktionen beruft sich 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 Data Access from CLR Database Objects.

Datenbankmodul analysiert automatisch den Hauptteil von Transact-SQL-Funktionen und bewertet dabei, ob die Funktion einen Datenzugriff ausführt. Bei CLR-Funktionen beruft 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 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.

Datenbankmodul analysiert automatisch den Hauptteil von Transact-SQL-Funktionen und bewertet dabei, ob die Funktion einen Systemdatenzugriff ausführt. Bei CLR-Funktionen beruft 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 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 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.

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.

Siehe auch

Konzepte

Benutzerdefinierte Tabellenwertfunktionen
Benutzerdefinierte Inlinefunktionen
Deterministische und nicht deterministische Funktionen
Neuerstellen von gespeicherten Prozeduren als Funktionen

Hilfe und Informationen

Informationsquellen für SQL Server 2005