Freigeben über


Deterministische und nicht deterministische Funktionen

Aktualisiert: 17. Juli 2006

Deterministische Funktionen geben bei jedem Aufrufen dasselbe Ergebnis zurück, wenn sie mit einem bestimmten Satz 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 Satz von Eingabewerten aufgerufen werden – selbst wenn die Datenbank, auf die zugegriffen wird, immer denselben Status hat.

Benutzerdefinierte Funktionen weisen eine Reihe von Eigenschaften auf, mit denen festgelegt wird, ob SQL Server-Datenbankmodul 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 Sicht kann z. B. kein gruppierter Index erstellt werden, falls die Sicht auf nicht deterministische Funktionen verweist. Weitere Informationen zu Eigenschaften von Funktionen, einschließlich Determinismus, finden Sie unter Richtlinien zum Entwerfen von benutzerdefinierten Funktionen.

Dieses Thema erläutert den Determinismus integrierter Systemfunktionen und die Auswirkungen auf die deterministische Eigenschaft benutzerdefinierter Funktionen, wenn in diesen ein Aufruf erweiterter gespeicherter Prozeduren enthalten ist.

Determinismus integrierter Funktionen

Der Determinismus integrierter Funktionen kann nicht beeinflusst werden. Jede integrierte Funktion ist deterministisch oder nicht deterministisch basierend auf der Art der Implementierung durch Microsoft SQL Server 2005.

Alle integrierten Aggregat- und Zeichenfolgenfunktionen sind deterministisch. Eine Liste dieser Funktionen finden Sie unter Aggregatfunktionen (Transact-SQL) und Zeichenfolgenfunktionen (Transact-SQL).

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

ABS

DATEDIFF

PARSENAME

ACOS

DAY

POWER

ASIN

DEGREES

RADIANS

ATAN

EXP

ROUND

ATN2

FLOOR

SIGN

CEILING

ISNULL

SIN

COALESCE

ISNUMERIC

SQUARE

COS

LOG

SQRT

COT

LOG10

TAN

DATALENGTH

MONTH

YEAR

DATEADD

NULLIF

 

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

Funktion Kommentare

CAST

Deterministisch, wenn nicht mit datetime, smalldatetime oder sql_variant verwendet.

CONVERT

Deterministisch, wenn nicht eine der folgenden Bedingungen vorliegt:

  • Der Quelltyp 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 Wert für style kleiner 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

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

RAND

RAND ist nur deterministisch, wenn ein seed-Parameter angegeben wird.

Alle Konfigurations-, Cursor-, Metadaten-, Sicherheits- und statistischen Systemfunktionen sind nicht deterministisch. Eine Liste dieser Funktionen finden Sie unter Konfigurationsfunktionen (Transact-SQL), Cursorfunktionen (Transact-SQL), Metadatenfunktionen (Transact-SQL), Sicherheitsfunktionen (Transact-SQL) und Statistische Systemfunktionen (Transact-SQL).

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

@@CONNECTIONS

@@TOTAL_READ

@@CPU_BUSY

@@TOTAL_WRITE

@@DBTS

CURRENT_TIMESTAMP

@@IDLE

GETDATE

@@IO_BUSY

GETUTCDATE

@@MAX_CONNECTIONS

GET_TRANSMISSION_STATUS

@@PACK_RECEIVED

MIN_ACTIVE_ROWVERSION

@@PACK_SENT

NEWID

@@PACKET_ERRORS

NEWSEQUENTIALID

@@TIMETICKS

RAND

@@TOTAL_ERRORS

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. eine Aktualisierung 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. Sie sollten sich nicht auf die Rückgabe eines konsistenten Resultsets verlassen, 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 eine erweiterte gespeicherte Prozedur aus einer Funktion heraus aufgerufen wird, kann die Prozedur keine Resultsets 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 die Verbindung mit SQL Server wieder herstellen. Die Prozedur kann jedoch nicht dieselbe Transaktion wie die ursprüngliche Funktion verknüpfen, welche die erweiterte gespeicherte Prozedur aufgerufen hat.

Wie bei Aufrufen von einem Batch oder einer gespeicherten Prozedur aus wird die erweiterte gespeicherte Prozedur im Kontext des Microsoft-Sicherheitskontos ausgeführt, unter dem SQL Server ausgeführt wird. Der Besitzer der erweiterten gespeicherten Prozedur sollte dies berücksichtigen, wenn er anderen Benutzern die Berechtigungen zum Ausführen der Prozedur gewährt.

Siehe auch

Konzepte

Richtlinien zum Entwerfen von benutzerdefinierten Funktionen
Benutzerdefinierte Tabellenwertfunktionen
Benutzerdefinierte Inlinefunktionen
Neuerstellen von gespeicherten Prozeduren als Funktionen

Andere Ressourcen

Entwerfen von benutzerdefinierten Funktionen

Hilfe und Informationen

Informationsquellen für SQL Server 2005

Änderungsverlauf

Version Verlauf
Geänderter Inhalt:
  • Es wurden Informationen zur Beschreibung der CONVERT-Funktion hinzugefügt, in denen erläutert wurde, dass beim Verwenden von CONVERT deterministische Ergebnisse erzeugt werden, sofern als Quell- oder Zieltyp datetime oder smalldatetime verwendet wird, der andere Quell- oder Zieltyp eine Zeichenfolge ist und ein nicht deterministisches Format angegeben ist.
  • Es wurde ebenfalls erläutert, welche Formate deterministisch bzw. nicht deterministisch sind.