Deterministische und nichtdeterministische Funktionen

Gilt für: SQL Server (alle unterstützten Versionen) Azure SQL Datenbank-Azure SQL Managed Instance

Deterministische Funktionen geben immer dasselbe Ergebnis jedes Mal zurück, wenn sie mit einem bestimmten Satz von Eingabewerten aufgerufen werden und demselben Zustand der Datenbank zugeordnet sind. Nichtdeterministische Funktionen können jedes Mal unterschiedliche Ergebnisse zurückgeben, wenn sie mit einem bestimmten Satz von Eingabewerten aufgerufen werden, auch wenn der Datenbankstatus, auf den sie zugreifen, gleich bleibt. Beispielsweise gibt die AVG-Funktion immer dasselbe Ergebnis zurück, sofern die zuvor genannten Bedingungen erfüllt sind. Die GETDATE-Funktion hingegen, die den aktuellen datetime-Wert liefert, gibt immer ein anderes Ergebnis zurück.

Es gibt mehrere Eigenschaften von benutzerdefinierten Funktionen, die die Fähigkeit des SQL Server Datenbankmoduls bestimmen, die Ergebnisse der Funktion zu indizieren, entweder über Indizes für berechnete Spalten, die die Funktion aufrufen, oder über indizierte Ansichten, die auf die Funktion verweisen. Der Determinismus einer Funktion ist eine solche Eigenschaft. Beispielsweise kann ein gruppierter Index nicht in einer Ansicht erstellt werden, wenn die Ansicht auf keine nichtdeterministischen Funktionen verweist. Weitere Informationen zu Eigenschaften von Funktionen, einschließlich Determinismus, finden Sie unter Benutzerdefinierte Funktionen.

Deterministische Funktionen müssen schemagebunden sein. Verwenden Sie die SCHEMABINDING Klausel beim Erstellen einer deterministischen Funktion.

In diesem Artikel werden die Determinismus integrierter Systemfunktionen und die Auswirkung auf die deterministische Eigenschaft von benutzerdefinierten Funktionen identifiziert, wenn sie einen Aufruf erweiterter gespeicherter Prozeduren enthält.

Bestimmen, ob eine Funktion deterministisch ist

Sie können überprüfen, ob eine Funktion deterministisch ist, indem Sie die is_deterministic Objekteigenschaft für die Funktion abfragen. Das folgende Beispiel bestimmt, ob die Funktion Sales.CalculateSalesTax deterministisch ist.

SELECT OBJECTPROPERTY(OBJECT_ID('Sales.CalculateSalesTax'), 'IsDeterministic');

Integrierte Funktionsdeterminismus

Sie können den Determinismus einer integrierten Funktion nicht beeinflussen. Jede integrierte Funktion ist deterministisch oder nicht deterministisch, basierend auf der Implementierung der Funktion durch SQL Server. Das Angeben einer ORDER BY-Klausel in einer Abfrage ändert beispielsweise nicht den Determinismus einer Funktion, die in dieser Abfrage verwendet wird.

Alle integrierten Zeichenfolgenfunktionen sind deterministisch, mit Ausnahme von FORMAT. Eine Liste dieser Funktionen finden Sie unter String Functions (Transact-SQL).

Die folgenden integrierten Funktionen aus Kategorien anderer integrierter Funktionen als Zeichenfolgenfunktionen sind immer deterministisch:

  • ABS (ABS)
  • ACOS
  • ASIN
  • ATAN
  • ATN2
  • CEILING
  • COALESCE
  • COS
  • COT
  • DATALENGTH
  • DATEADD
  • DATEDIFF
  • DAY
  • DEGREES
  • EXP
  • FLOOR
  • ISNULL
  • ISNUMERIC
  • PROTOKOLL
  • LOG10
  • MONTH
  • NULLIF
  • POWER
  • RADIANS
  • ROUND
  • SIGN
  • SIN
  • SQRT
  • SQUARE
  • TAN
  • YEAR

Die folgenden Funktionen sind nicht immer deterministisch, können aber in indizierten Ansichten oder Indizes für berechnete Spalten verwendet werden, wenn sie auf deterministische Weise angegeben werden.

Funktion Kommentare
alle Aggregatfunktionen Alle Aggregatfunktionen sind deterministisch, es sei denn, sie werden mit den OVER- und ORDER BY-Klauseln angegeben. Eine Liste dieser Funktionen finden Sie unter "Aggregatfunktionen(Transact-SQL)".
CAST Deterministisch, wenn nicht mit datetime, smalldatetimeoder sql_variantverwendet.
CONVERT Deterministisch, wenn nicht eine der folgenden Bedingungen vorliegt:

Der Typ ist sql_variant.

Der Zieltyp ist sql_variant , und der Quelltyp ist nicht deterministisch.

Der Quell- oder Zieltyp ist datetime oder smalldatetime, der andere Quell- oder Zieltyp ist eine Zeichenfolge, und es wird ein nicht deterministisches Format angegeben. Ein deterministisches Format kann nur verwendet werden, wenn der style-Parameter konstant ist. Wenn die Werte für "style" kleiner oder gleich 100 sind, sind sie nicht deterministisch, mit Ausnahme der style-Werte 20 und 21. style-Werte über 100 sind deterministisch, mit Ausnahme der style-Werte 106, 107, 109 und 113.
CHECKSUM Deterministisch, mit Ausnahme von CHECKUM(*).
ISDATE Nur deterministisch in Verbindung mit der CONVERT-Funktion, wenn der style-Parameter von CONVERT angegeben ist und "style" nicht den Wert 0, 100, 9 oder 109 aufweist.
RAND RAND ist nur deterministisch, wenn ein seed -Parameter angegeben wird.

Alle Konfigurations-, Cursor-, Metadaten-, Sicherheits- und statistischen Systemfunktionen sind nicht deterministisch. Sie können eine Liste dieser Funktionen sehen.

Die folgenden integrierten Funktionen aus anderen Kategorien sind immer nicht deterministisch:

  • @@CONNECTIONS
  • @@CPU_BUSY
  • @@DBTS
  • @@IDLE
  • @@IO_BUSY
  • @@MAX_CONNECTIONS
  • @@PACKET_ERRORS
  • @@PACK_RECEIVED
  • @@PACK_SENT
  • @@TIMETICKS
  • @@TOTAL_ERRORS
  • @@TOTAL_READ
  • @@TOTAL_WRITE
  • AT TIME ZONE
  • CUME_DIST
  • CURRENT_TIMESTAMP
  • DENSE_RANK
  • FIRST_VALUE
  • FORMAT
  • GETDATE
  • GETUTCDATE
  • GET_TRANSMISSION_STATUS
  • LAG
  • LAST_VALUE
  • LEAD
  • MIN_ACTIVE_ROWVERSION
  • NEWID
  • NEWSEQUENTIALID
  • NEXT VALUE FOR
  • NTILE
  • PARSENAME
  • PERCENTILE_CONT
  • PERCENTILE_DISC
  • PERCENT_RANK
  • RAND
  • RANK
  • ROW_NUMBER
  • TEXTPTR

Aufrufen erweiterter gespeicherter Prozeduren aus Funktionen

Funktionen, die erweiterte gespeicherte Prozeduren aufrufen, sind nicht deterministisch, da erweiterte gespeicherte Prozeduren Nebeneffekte im Hinblick auf die Datenbank verursachen können. Nebeneffekte sind Änderungen am globalen Status der Datenbank, wie z. B. ein Update einer Tabelle, oder an einer externen Ressource, wie z. B. einer Datei oder des Netzwerkes. Beispiel: Änderungen an einer Datei oder Senden einer E-Mail-Nachricht. Verlassen Sie sich nicht auf die Rückgabe eines konsistenten Ergebnissatzes beim Ausführen einer erweiterten gespeicherten Prozedur aus einer benutzerdefinierten Funktion. Benutzerdefinierte Funktionen, die Nebenwirkungen auf der Datenbank erstellen, werden nicht empfohlen.

Wenn Sie aus einer Funktion aufgerufen werden, kann die erweiterte gespeicherte Prozedur keine Ergebnissätze an den Client zurückgeben. Jede Open Data Services-API, die Resultsets an den Client zurückgibt, weist den Rückgabecode FAIL auf.

Die erweiterte gespeicherte Prozedur kann eine Verbindung mit SQL Server herstellen. Die Prozedur kann jedoch nicht mit der ursprünglichen Funktion verknüpft werden, die die erweiterte gespeicherte Prozedur aufgerufen hat.

Ähnlich wie Aufrufe aus einer Batch- oder gespeicherten Prozedur wird die erweiterte gespeicherte Prozedur im Kontext des Microsoft Windows-Sicherheitskontos ausgeführt, unter dem SQL Server ausgeführt wird. Der Besitzer der erweiterten gespeicherten Prozedur sollte diese Berechtigungen dieses Sicherheitskontexts berücksichtigen, wenn er anderen Benutzern Berechtigungen zum Ausführen der Prozedur erteilt.

Weitere Informationen