Freigeben über


Deterministische und nicht deterministische Funktionen

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-Analyseendpunkt in Microsoft FabricLagerhaus in Microsoft FabricSQL-Datenbank in Microsoft Fabric

Deterministische Funktionen geben bei jedem Aufrufen dasselbe Ergebnis zurück, wenn sie mit einem bestimmten Satz von Eingabewerten aufgerufen werden und die Datenbank denselben Status aufweist. Nicht deterministische Funktionen geben möglicherweise jedes Mal unterschiedliche Ergebnisse zurück, wenn sie mit einem bestimmten Satz von Eingabewerten aufgerufen werden, auch wenn der Datenbankstatus, auf den sie zugreifen, unverändert bleibt. Die Funktion AVG gibt z. B. immer dasselbe Ergebnis zurück, wenn die zuvor angegebenen Qualifikationen angegeben wurden, aber die GETDATE Funktion, die den aktuellen Datetime-Wert zurückgibt, immer ein anderes Ergebnis zurückgibt.

Benutzerdefinierte Funktionen weisen eine Reihe von Eigenschaften auf, mit denen festgelegt wird, ob die SQL Server Datenbank-Engine in der Lage ist, die Ergebnisse der Funktion zu indizieren, entweder durch Indizes für berechnete Spalten, die die Funktion aufrufen, oder durch indizierte Sichten, die auf die Funktion verweisen. Der Determinismus einer Funktion ist eine solche Eigenschaft. Für eine Anzeige kann z. B. kein gruppierter Index erstellt werden, falls die Anzeige auf nicht deterministische Funktionen verweist. Weitere Informationen zu den 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.

Dieser Artikel befasst sich mit dem Determinismus von eingebauten Systemfunktionen und den Auswirkungen auf die deterministische Eigenschaft von benutzerdefinierten Funktionen, wenn diese einen Aufruf von erweiterten gespeicherten Prozeduren enthalten.

Ermitteln, ob eine Funktion deterministisch ist

Sie können überprüfen, ob eine Funktion deterministisch ist, indem Sie die Objekteigenschaft is_deterministic für die Funktion abfragen. Im folgenden Beispiel wird ermittelt, ob die Funktion Sales.CalculateSalesTax deterministisch ist.

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

Integrierter Funktionsdeterminismus

Der Determinismus integrierter Funktionen kann nicht beeinflusst werden. Jede integrierte Funktion ist deterministisch oder nicht deterministisch, basierend auf der Implementierung der Funktion durch SQL Server. Beispielsweise ändert das Angeben einer ORDER BY Klausel in einer Abfrage 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 "Zeichenfolgenfunktionen".

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

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

Die folgenden Funktionen sind nicht immer deterministisch, können jedoch in indizierten Anzeigen oder Indizes für berechnete Spalten verwendet werden, wenn sie als deterministische Funktion angegeben werden.

Funktion Kommentare
Alle Aggregatfunktionen Alle Aggregatfunktionen sind deterministisch, es sei denn, sie werden mit den OVER Und-Klauseln ORDER BY angegeben. Eine Liste dieser Funktionen finden Sie unter "Aggregatfunktionen".
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 CHECKSUM(*).
ISDATE Deterministisch nur, wenn sie mit der CONVERT Funktion verwendet wird, wird der Formatvorlagenparameter angegeben, und die CONVERT Formatvorlage ist nicht gleich 0, 100, 9 oder 109.
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 anzeigen.

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 an einem globalen Zustand der Datenbank, z. B. einer Aktualisierung einer Tabelle oder einer externen Ressource, z. B. einer Datei oder des Netzwerks. Beispiele hierfür sind das Ändern einer Datei oder das Senden einer E-Mail-Nachricht. Verlassen Sie sich nicht auf die Rückgabe eines konsistenten Resultsets, wenn Sie eine erweiterte gespeicherte Prozedur von einer benutzerdefinierten Funktion aus ausführen. Die Verwendung benutzerdefinierter Funktionen, die zu Nebeneffekten hinsichtlich der Datenbank führen, wird nicht empfohlen.

Wenn sie von einer Funktion aus aufgerufen wird, kann die erweiterte gespeicherte Prozedur keine Resultsets an den Client zurückgeben. Jede Open Data Services-API, die Resultsets an den Client zurückgibt, verfügt über einen Rückgabecode von FAIL.

Die erweiterte gespeicherte Prozedur kann erneut eine Verbindung mit SQL Server herstellen. Die Prozedur kann jedoch keine Verbindung mit derselben Transaktion wie die ursprüngliche Funktion herstellen, durch die die erweiterte gespeicherte Prozedur aufgerufen wurde.

Ähnlich wie aufrufe aus einem Batch oder einer gespeicherten Prozedur wird die erweiterte gespeicherte Prozedur im Kontext des 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.