Freigeben über


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

Aggregatfunktionen (Transact-SQL)

Führen Vorgänge durch, die mehrere Werte zu einem Wert kombinieren. Beispiele hierfür sind COUNT, SUM, MIN und MAX.

Konfigurationsfunktionen (Transact-SQL)

Skalarfunktionen, die Informationen zu Konfigurationseinstellungen zurückgeben

Kryptografiefunktionen (Transact-SQL)

Unterstützen die Verschlüsselung, die Entschlüsselung, digitale Signaturen und die Überprüfung digitaler Signaturen

Cursorfunktionen (Transact-SQL)

Geben Informationen über den Status eines Cursors zurück

Datums- und Zeitfunktionen (Transact-SQL)

Ändern das Datum und die Uhrzeit

Mathematische Funktionen (Transact-SQL)

Führen trigonometrische, geometrische und andere numerische Vorgänge durch

Metadatenfunktionen (Transact-SQL)

Geben Informationen zu den Attributen von Datenbanken und Datenbankobjekten zurück

Rangfolgefunktionen (Transact-SQL)

Nicht deterministische Funktionen, die für jede Partitionszeile einen Rangfolgenwert zurückgeben

Rowsetfunktionen (Transact-SQL)

Geben die Rowsets zurück, die anstelle eines Tabellenverweises in einer Transact-SQL-Anweisung verwendet werden können

Sicherheitsfunktionen (Transact-SQL)

Geben Informationen über Benutzer und Rollen zurück

Zeichenfolgenfunktionen (Transact-SQL)

Ändern Werte vom Typ char, varchar, nchar, nvarchar, binary und varbinary

Systemfunktionen (Transact-SQL)

Führen Vorgänge für Optionen und Objekte auf verschiedenen Systemebenen durch oder geben Meldungen über diese Optionen und Objekte aus

Statistische Systemfunktionen (Transact-SQL)

Geben Informationen zur Leistung von SQL Server zurück

Text- und Imagefunktionen (Transact-SQL)

Ä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.