Funktionen (Datenbankmodul)
SQL Server stellt integrierte Funktionen bereit, mit denen bestimmte Vorgänge ausgeführt werden können.
Funktionen können in den folgenden Elementen verwendet oder in diese eingeschlossen werden:
In der Auswahlliste einer Abfrage, die eine SELECT-Anweisung zum Zurückgeben eines Wertes verwendet.
SELECT DB_NAME(); GO
In einer Suchbedingung in der WHERE-Klausel einer SELECT-Anweisung oder Datenänderungsanweisung (INSERT, DELETE oder UPDATE), mit der die Zeilen begrenzt werden, die der Abfrage entsprechen.
USE AdventureWorks2008R2; GO SELECT SalesOrderID, ProductID, OrderQty FROM Sales.SalesOrderDetail WHERE OrderQty = (SELECT MAX(OrderQty) FROM Sales.SalesOrderDetail); GO
In der Suchbedingung (WHERE-Klausel) einer Sicht, um die Sicht zur Laufzeit dynamisch an den Benutzer oder die Umgebung anzupassen.
CREATE VIEW ShowMyEmploymentInfo AS SELECT FirstName, LastName FROM Person.Person WHERE BusinessEntityID = SUSER_SID(); GO
In jedem Ausdruck.
In einer CHECK-Einschränkung oder einem Trigger zum Suchen nach angegebenen Werten, wenn Daten eingefügt werden.
CREATE TABLE SalesContacts (SalesRepID INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ), ContactName VARCHAR(50) NULL, ContactPhone VARCHAR(13) NULL); GO
In einer DEFAULT-Einschränkung oder einem Trigger zum Bereitstellen eines Wertes für den Fall, dass von einer INSERT-Anweisung kein Wert angegeben wird.
CREATE TABLE SalesContacts ( SalesRepID INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ), ContactName VARCHAR(50) NULL, ContactPhone VARCHAR(13) NULL, WhenCreated DATETIME DEFAULT GETDATE(), Creator INT DEFAULT SUSER_SID() ); GO
Funktionen werden mit Klammern angegeben, selbst wenn sie keine Parameter haben. Eine Ausnahme stellen die NILADIC-Funktionen dar, die mit dem DEFAULT-Schlüsselwort verwendet werden. NILADIC-Funktionen haben keine Parameter. Weitere Informationen zum DEFAULT-Schlüsselwort finden Sie unter ALTER TABLE (Transact-SQL) und CREATE TABLE (Transact-SQL).
Die Parameter zur Angabe einer Datenbank, eines Computers, eines Benutzernamens oder eines Datenbankbenutzers sind manchmal optional. Falls die Parameter nicht angegeben sind, werden sie standardmäßig auf die Datenbank, den Hostcomputer, den Benutzernamen oder den Datenbankbenutzer eingestellt, die bzw. der gerade aktuell ist.
Funktionen können geschachtelt werden.
Funktionskategorien
In der folgenden Tabelle sind die Kategorien für die SQL Server-Funktionen aufgelistet.
Funktionskategorie |
Beschreibung |
---|---|
Führen Vorgänge durch, die mehrere Werte zu einem Wert kombinieren. Beispiele hierfür sind COUNT, SUM, MIN und MAX. |
|
Skalarfunktionen, die Informationen zu Konfigurationseinstellungen zurückgeben |
|
Unterstützen die Verschlüsselung, die Entschlüsselung, digitale Signaturen und die Überprüfung digitaler Signaturen |
|
Geben Informationen über den Status eines Cursors zurück |
|
Ändern das Datum und die Uhrzeit |
|
Führen trigonometrische, geometrische und andere numerische Vorgänge durch |
|
Geben Informationen zu den Attributen von Datenbanken und Datenbankobjekten zurück |
|
Nicht deterministische Funktionen, die für jede Partitionszeile einen Rangfolgenwert zurückgeben |
|
Geben die Rowsets zurück, die anstelle eines Tabellenverweises in einer Transact-SQL-Anweisung verwendet werden können |
|
Geben Informationen über Benutzer und Rollen zurück |
|
Ändern Werte vom Typ char, varchar, nchar, nvarchar, binary und varbinary |
|
Führen Vorgänge für Optionen und Objekte auf verschiedenen Systemebenen durch oder geben Meldungen über diese Optionen und Objekte aus |
|
Geben Informationen zur Leistung von SQL Server zurück |
|
Ändern Werte vom Typ text und image |
Deterministische und nicht deterministische Funktionen
In SQL Server werden Funktionen als streng deterministisch, deterministisch oder nicht deterministisch klassifiziert.
Eine Funktion ist streng deterministisch, wenn sie für bestimmte Eingabewerte immer dieselben Ergebnisse zurückgibt.
Für benutzerdefinierte Funktionen wird eine weniger strenge Definition von Determinismus verwendet. Eine benutzerdefinierte Funktion ist deterministisch, wenn sie für bestimmte Eingabewerte und einen bestimmten Datenbankstatus immer dieselben Ergebnisse zurückgibt. Wenn die Funktion nicht streng deterministisch ist, kann sie in diesem Sinn deterministisch sein, falls sie auf Daten zugreift.
Eine nicht deterministische Funktion kann unterschiedliche Ergebnisse zurückgeben, wenn sie mit denselben Eingabewerten wiederholt aufgerufen wird. Beispielsweise ist die GETDATE()-Funktion nicht deterministisch. SQL Server schränkt verschiedene Klassen von Nichtdeterminismus ein. Deshalb sollten nicht deterministische Funktionen mit Vorsicht verwendet werden.
Für integrierte Funktionen sind Determinismus und strenger Determinismus identisch. Für benutzerdefinierte Funktionen von Transact-SQL überprüft das System die Definition und verhindert die Definition von nicht deterministischen Funktionen. Eine Funktion, die auf Daten zugreift oder nicht schemagebunden ist, wird als nicht streng deterministisch betrachtet. Für CLR-Funktionen (Common Language Runtime) geben Funktionsdefinitionen die Eigenschaften für Determinismus, Datenzugriff und Systemdatenzugriff der Funktion an. Da diese Eigenschaften jedoch nicht vom System überprüft werden, werden sie stets als nicht streng deterministisch betrachtet.
Der fehlende Determinismus einer Funktion kann ihre Verwendungsweise einschränken. Nur deterministische Funktionen können in indizierten Sichten, indizierten berechneten Spalten, permanenten berechneten Spalten oder Definitionen benutzerdefinierter Funktionen von Transact-SQL verwendet werden.
Durch den mangelnden strengen Determinismus einer Funktion können wichtige Leistungsoptimierungen blockiert werden. Bestimmte Planneuordnungsschritte werden ausgelassen, um die Richtigheit aufrechtzuerhalten. Darüber hinaus sind Anzahl, Reihenfolge und Zeitpunkt von Aufrufen benutzerdefinierter Funktionen von der jeweiligen Implementierung abhängig. Verlassen Sie sich nicht auf diese Aufrufsemantik. Neben den nicht deterministischen integrierten Laufzeitkonstanten RAND und GETDATE hängen Anzahl, Reihenfolge und Zeitpunkt von Aufrufen vom gewählten Plan ab.
Empfehlungen zu bewährten Methoden
Wir empfehlen, dass Sie sich soweit möglich an die folgenden Richtlinien halten:
1. Erstellen Sie streng deterministische Funktionen, wenn Sie die Auswahl haben. Insbesondere sollten Ihre Transact-SQL-Funktionen schemagebunden sein.
2. Beschränken Sie die Verwendung nicht deterministischer Funktionen auf die äußersten Auswahllisten.
3. Verwenden Sie in Abfragen, bei denen es auf die Leistung ankommt, keine nicht deterministischen Funktionen.
4. Verlassen Sie sich nicht auf Anzahl, Reihenfolge oder Zeitpunkt von Aufrufen, weil dies von der Implementierung abhängig sein kann.
Weitere Informationen finden Sie unter Deterministische und nicht deterministische Funktionen.
Siehe auch