SET (Transact-SQL)
Die Programmiersprache Transact-SQL bietet eine Reihe von SET-Anweisungen, mit denen die Verarbeitung bestimmter Informationen durch die aktuelle Sitzung geändert werden kann. Die SET-Anweisungen sind in die in der folgenden Tabelle gezeigten Kategorien unterteilt.
Informationen zum Festlegen von lokalen Variablen mit der SET-Anweisung finden Sie unter SET @local\_variable (Transact-SQL).
Kategorie |
Anweisungen |
---|---|
Datums- und Zeitanweisungen |
|
Sperranweisungen |
|
Verschiedene Anweisungen |
|
Abfrageausführungsanweisungen |
|
Anweisungen für ISO-Einstellungen |
|
Statistikanweisungen |
|
Transaktionsanweisungen |
Überlegungen beim Verwenden von SET-Anweisungen
Alle SET-Anweisungen außer SET FIPS_FLAGGER, SET OFFSETS, SET PARSEONLY und SET QUOTED_IDENTIFIER werden zur Ausführungs- oder Laufzeit implementiert. Die genannten Anweisungen werden zur Analysezeit implementiert.
Wenn eine SET-Anweisung in einer gespeicherten Prozedur oder einem Trigger ausgeführt wird, so wird der Wert der SET-Option wiederhergestellt, nachdem die gespeicherte Prozedur oder der Trigger die Steuerung zurückgegeben hat. Wenn eine SET-Anweisung in einer dynamischen SQL-Zeichenfolge angegeben wird, die entweder mithilfe von sp_executesql oder mithilfe von EXECUTE ausgeführt wird, wird der Wert der SET-Option ebenfalls wiederhergestellt, nachdem der in der dynamischen SQL-Zeichenfolge angegebene Batch die Steuerung zurückgegeben hat.
Gespeicherte Prozeduren werden mit den SET-Einstellungen ausgeführt, die zur Ausführungszeit angegeben wurden. Ausgenommen hiervon sind SET ANSI_NULLS und SET QUOTED_IDENTIFIER. Gespeicherte Prozeduren, für die SET ANSI_NULLS oder SET QUOTED_IDENTIFIER angegeben ist, verwenden die Einstellung, die zur Erstellungszeit der gespeicherten Prozedur angegeben wurde. Bei Verwendung innerhalb einer gespeicherten Prozedur werden SET-Einstellungen ignoriert.
Die user options-Einstellung von sp_configure ermöglicht serverweite Einstellungen, und sie arbeitet datenbankübergreifend. Diese Einstellung wirkt außerdem wie eine explizite SET-Anweisung, mit der Ausnahme, dass sie zur Anmeldezeit erfolgt.
Datenbankeinstellungen, die mithilfe von ALTER DATABASE festgelegt werden, sind nur auf Datenbankebene gültig und treten nur dann in Kraft, wenn sie explizit festgelegt werden. Datenbankeinstellungen setzen Instanzoptionseinstellungen außer Kraft, die mithilfe von sp_configure festgelegt werden.
Bei jeder SET-Anweisung, die über die Einstellungen ON und OFF verfügt, können Sie die Einstellung ON oder OFF für mehrere SET-Optionen gleichzeitig angeben.
Hinweis Dies gilt nicht für die statistikbezogenen SET-Optionen.
Beispielsweise legt SET QUOTED_IDENTIFIER, ANSI_NULLS ON sowohl für QUOTED_IDENTIFIER als auch für ANSI_NULLS die Einstellung ON fest.
Einstellungen von SET-Anweisungen setzen die entsprechenden Einstellungen der Datenbankoptionen außer Kraft, die mithilfe von ALTER DATABASE festgelegt werden. Beispielsweise setzt der in einer SET ANSI_NULLS-Anweisung angegebene Wert die Datenbankeinstellung für ANSI_NULLs außer Kraft. Darüber hinaus werden einige Verbindungseinstellungen automatisch auf ON festgelegt, wenn ein Benutzer eine Verbindung zu einer Datenbank herstellt und dabei die Werte verwendet, die durch vorherige Verwendung der sp_configure user options-Einstellung in Kraft getreten sind oder die auf alle ODBC- und OLE DB-Verbindungen angewendet werden.
Die Anweisungen ALTER, CREATE und DROP DATABASE berücksichtigen die Einstellung von SET LOCK_TIMEOUT nicht.
Wenn eine globale oder zusammengefasste SET-Anweisung, wie z. B. SET ANSI_DEFAULTS, mehrere Einstellungen festlegt, setzt das Ausgeben einer solchen SET-Anweisung die vorherigen Einstellungen aller Optionen außer Kraft, auf die sich die zusammengefasste SET-Anweisung auswirkt. Wenn eine einzelne von einer zusammengefassten SET-Anweisung betroffene SET-Option explizit festgelegt wird, nachdem die zusammengefasste SET-Anweisung ausgegeben wurde, setzt die individuelle SET-Anweisung die entsprechenden Einstellungen der zusammengefassten SET-Anweisung außer Kraft.
Wenn Batches verwendet werden, wird der Datenbankkontext durch den Batch bestimmt, der mithilfe der USE-Anweisung eingerichtet wurde. Ad-hoc-Abfragen und alle anderen Anweisungen, die außerhalb der gespeicherten Prozedur ausgeführt werden und sich in Batches befinden, übernehmen die Optionseinstellungen der Datenbank und der Verbindung, die mit der USE-Anweisung eingerichtet wurden.
MARS-Anforderungen (Multiple Active Result Set) nutzen gemeinsam einen globalen Status, der die jeweils aktuellen Einstellungen der SET-Optionen für die Sitzung enthält. Bei der Ausführung kann jede Anforderung die SET-Optionen ändern. Die Änderungen gelten speziell für den Anforderungskontext, in dem sie festgelegt werden, und haben keine Auswirkungen auf andere gleichzeitige MARS-Anforderungen. Nachdem die Anforderungsausführung abgeschlossen ist, werden die neuen SET-Optionen jedoch in den globalen Status der Sitzung kopiert. Neue Anforderungen, die nach dieser Änderung unter der gleichen Sitzung ausgeführt werden, verwenden diese neuen SET-Optionseinstellungen.
Wird eine gespeicherte Prozedur aus einem Batch oder einer anderen gespeicherten Prozedur heraus ausgeführt, so wird sie anhand der aktuellen Optionswerte der Datenbank ausgeführt, die die gespeicherte Prozedur enthält. Wenn z. B. die gespeicherte Prozedur db1.dbo.sp1 die gespeicherte Prozedur db2.dbo.sp2 aufruft, wird die gespeicherte Prozedur sp1 unter der aktuellen Einstellung des Kompatibilitätsgrades von Datenbank db1 ausgeführt, und die gespeicherte Prozedur sp2 wird unter der aktuellen Einstellung des Kompatibilitätsgrades von Datenbank db2 ausgeführt.
Wenn eine Transact-SQL-Anweisung auf Objekte verweist, die in mehreren Datenbanken gespeichert sind, gelten der aktuelle Datenbankkontext und der aktuelle Verbindungskontext für die Anweisung. Befindet sich die Transact-SQL-Anweisung in diesem Fall in einem Batch, handelt es sich bei dem aktuellen Verbindungskontext um die durch die USE-Anweisung definierte Datenbank. Befindet sich die Transact-SQL-Anweisung in einer gespeicherten Prozedur, handelt es sich bei dem Verbindungskontext um die Datenbank, die die gespeicherte Prozedur enthält.
Beim Erstellen und Bearbeiten von Indizes für berechnete Spalten oder indizierten Sichten müssen die SET-Optionen ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER, ANSI_NULLS, ANSI_PADDING und ANSI_WARNINGS auf ON festgelegt sein. Die Option NUMERIC_ROUNDABORT muss auf OFF festgelegt sein.
Ist eine der Optionen nicht auf den erforderlichen Wert festgelegt, schlagen die Aktionen INSERT, UPDATE, DELETE, DBCC CHECKDB und DBCC CHECKTABLE für indizierte Sichten oder Tabellen mit Indizes für berechnete Spalten fehl. SQL Server löst einen Fehler aus, in dem alle falsch festgelegten Optionen aufgelistet werden. Außerdem verarbeitet SQL Server die SELECT-Anweisungen in diesen Tabellen oder indizierten Sichten so, als seien die Indizes auf den berechneten Spalten oder Sichten nicht vorhanden.