sp_dbcmptlevel (Transact-SQL)

Aktualisiert: 17. Juli 2006

Legt für bestimmte Verhalten der Datenbank fest, dass sie mit der angegebenen Version von SQL Server kompatibel sein müssen.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

sp_dbcmptlevel [ [ @dbname = ] name ] 
    [ , [ @new_cmptlevel = ] version ]

Argumente

  • [ @dbname= ] name
    Der Name der Datenbank, deren Kompatibilitätsgrad geändert werden soll. Datenbanknamen müssen den Regeln für Bezeichner entsprechen. name ist ein Wert vom Datentyp sysname; der Standardwert ist NULL.
  • [ @new_cmptlevel= ] version
    Die SQL Server-Version, mit der die Datenbank kompatibel sein soll. version ist ein Wert vom Datentyp tinyint; der Standardwert ist NULL. Folgende Werte sind zulässig:

    60 = SQL Server 6.0

    65 = SQL Server 6.5

    70 = SQL Server 7.0

    80 = SQL Server 2000

    90 = SQL Server 2005

    ms178653.note(de-de,SQL.90).gifHinweis:
    Die Werte 60 und 65 sind als veraltet markiert und werden in einer zukünftigen Version entfernt.
    ms178653.Caution(de-de,SQL.90).gifVorsicht:
    SQL Server Management Studio und SQL Server Management Objects (SMO) unterstützen den Kompatibilitätsgrad 60 nicht. Wenn Sie SMO oder Management Studio mit einer Datenbank verwenden, die auf einen Kompatibilitätsgrad von 60 festgelegt ist, treten bei einigen Vorgängen Fehler auf.

Rückgabecodewerte

0 (Erfolg) oder 1 (Fehler)

Resultsets

Wenn keine Parameter angegeben werden oder wenn der name-Parameter nicht angegeben wird, gibt sp_dbcmptlevel einen Fehler zurück.

Wenn name ohne version angegeben wird, gibt SQL Server 2005-Datenbankmodul eine Meldung zurück, die den aktuellen Kompatibilitätsgrad der angegebenen Datenbank anzeigt.

Hinweise

Bei allen Installationen von SQL Server 2005 hat der Standardkompatibilitätsgrad den Wert 90. Unter SQL Server 2005 erstellte Datenbanken sind auf diesen Grad festgelegt, es sei denn, der Kompatibilitätsgrad der model-Datenbank ist auf einen niedrigeren Wert festgelegt. Wenn eine Datenbank von einer vorherigen SQL Server-Version auf SQL Server 2005 aktualisiert wird, behält die Datenbank den bestehenden Kompatibilitätsgrad bei. Dies gilt sowohl für die System- als auch für die Benutzerdatenbanken. Verwenden Sie sp_dbcmptlevel, um den Kompatibilitätsgrad der Datenbank in 90 zu ändern. Zum Anzeigen des aktuellen Kompatibilitätsgrads der Datenbank fragen Sie die compatibility_level-Spalte in der sys.databases-Katalogsicht ab.

Verwenden von "sp_dbcmptlevel" für Abwärtskompatibilität

Die gespeicherte Prozedur sp_dbcmptlevel wirkt sich nur auf das Verhalten der angegebenen Datenbank und nicht auf den gesamten Server aus. sp_dbcmptlevel stellt nur eine partielle Abwärtskompatibilität mit früheren Versionen von SQL Server bereit. Verwenden Sie sp_dbcmptlevel als vorläufige Migrationshilfe, um versionsbedingte Unterschiede in den Verhaltensweisen zu umgehen, die über die jeweilige Einstellung für den Kompatibilitätsgrad gesteuert werden. Wenn sich unterschiedliche Verhaltensweisen in SQL Server 2005 auf vorhandene SQL Server-Anwendungen auswirken, sollten Sie die Anwendung konvertieren, damit sie ordnungsgemäß funktioniert. Verwenden Sie dann die sp_dbcmptlevel-Anweisung, um den Kompatibilitätsgrad in 90 zu ändern. Die neue Kompatibilitätseinstellung für eine Datenbank tritt in Kraft, wenn die Datenbank das nächste Mal zur aktuellen Datenbank wird (als Standarddatenbank bei der Anmeldung oder durch Angabe in einer USE-Anweisung).

Bei einer Datenbank mit einer indizierten Sicht kann der Kompatibilitätsgrad nicht auf einen Wert unter 80 festgelegt werden.

Bewährte Methoden

Das Ändern des Kompatibilitätsgrads, während Benutzer mit der Datenbank verbunden sind, kann zu fehlerhaften Resultsets für aktive Abfragen führen. Wird der Kompatibilitätsgrad z. B. während der Kompilierung eines Abfrageplans geändert, basiert der kompilierte Plan möglicherweise sowohl auf dem alten als auch auf dem neuen Kompatibilitätsgrad. Dies führt zu einem fehlerhaften Plan und möglicherweise ungenauen Ergebnissen. Das Problem kann noch verstärkt werden, wenn der Plan im Plancache gespeichert und für nachfolgende Abfragen erneut verwendet wird. Um ungenaue Ergebnisse zu vermeiden, wird zum Ändern des Kompatibilitätsgrads einer Datenbank das folgende Verfahren empfohlen:

  1. Legen Sie die Datenbank mithilfe von ALTER DATABASE SET SINGLE_USER auf den Einzelbenutzermodus fest.
  2. Ändern Sie den Kompatibilitätsgrad der Datenbank.
  3. Legen Sie die Datenbank mithilfe von ALTER DATABASE SET MULTI_USER auf den Mehrbenutzermodus fest.
  4. Weitere Informationen zum Festlegen des Zugriffs auf eine Datenbank finden Sie unter ALTER DATABASE (Transact-SQL).

SET-Optionen

Neue Funktionen sind möglicherweise mit älteren Kompatibilitätsgraden funktionsfähig, die SET-Optionen erfordern jedoch ggf. Anpassungen. Beispielsweise müssen die ANSI SET-Optionen entsprechend festgelegt werden, wenn der xml-Datentyp bei einem Kompatibilitätsgrad von 80 verwendet werden soll. Ist der Datenbank-Kompatibilitätsgrad auf 90 festgelegt, wird beim Festlegen von ANSI_WARNINGS auf ON implizit auch ARITHABORT auf ON festgelegt. Wenn der Kompatibilitätsgrad der Datenbank auf 80 oder niedriger festgelegt wird, muss die Option ARITHABORT explizit auf ON festgelegt werden. Weitere Informationen finden Sie unter SET-Optionen mit Auswirkungen auf Ergebnisse.

Kompatibilitätsgrade und gespeicherte Prozeduren

Wenn eine gespeicherte Prozedur ausgeführt wird, verwendet sie den aktuellen Kompatibilitätsgrad der Datenbank, in der sie definiert ist. Wenn die Kompatibilitätseinstellung einer Datenbank geändert wird, werden alle zugehörigen gespeicherten Prozeduren automatisch entsprechend neu kompiliert.

Hinweise zum Kontext bei der Verwendung von "sp_dbcmptlevel"

Jeder Aufruf von sp_dbcmptlevel muss einzeln übermittelt werden. sp_dbcmptlevel kann nicht aus anderen Kontexten heraus aufgerufen werden. Hierzu zählen folgende:

  • Gespeicherte Prozeduren.
  • Transact-SQL-Zeichenfolge, die mit der EXEC(string)-Syntax ausgeführt wird.
  • Batch von Transact-SQL-Anweisungen.

Unterschiede zwischen dem Kompatibilitätsgrad 60 oder 65 und dem Kompatibilitätsgrad 70, 80 oder 90

Das Festlegen des Kompatibilitätsgrads auf 60 oder 65 wirkt sich auf viele Verhaltensweisen aus. Hierzu zählen u. a. die Unterschiede, die in der linken Spalte der folgenden Tabelle aufgeführt sind.

ms178653.note(de-de,SQL.90).gifHinweis:
Weitere Unterschiede, die 6.x-Anwendungen betreffen, finden Sie unter "Unterschiede zwischen niedrigeren Kompatibilitätsgraden und Kompatibilitätsgrad 90" weiter unten in diesem Thema. Unterschiede, die reservierte Schlüsselwörter in Versionen nach 6.x betreffen, finden Sie im Abschnitt mit den Hinweisen.

Kompatibilitätsgradeinstellung 60 oder 65

Kompatibilitätsgradeinstellung 70 oder höher

Die Resultsets von SELECT-Anweisungen mit einer GROUP BY-Klausel und keiner ORDER BY-Klausel werden nach den GROUP BY-Spalten sortiert.

Eine GROUP BY-Klausel führt keine eigenständige Sortierung durch. Eine ORDER BY-Klausel muss explizit angegeben werden, damit Resultsets von SQL Server sortiert werden. Weitere Informationen finden Sie unter SELECT (Transact-SQL).

Spalten, denen Tabellenaliasnamen vorangestellt sind, werden in der SET-Klausel von UPDATE-Anweisungen angenommen.

Tabellenaliasnamen werden in der SET-Klausel einer UPDATE-Anweisung nicht angenommen. Die in der SET-Klausel angegebene Tabelle oder Sicht muss mit der Tabelle oder Sicht übereinstimmen, die unmittelbar auf das UPDATE-Schlüsselwort folgt. Weitere Informationen finden Sie unter UPDATE (Transact-SQL).

bit-Spalten, die ohne explizite Angabe von NULL oder NOT NULL in CREATE TABLE oder ALTER TABLE erstellt werden, werden als NOT NULL-Spalten erstellt.

Die NULL-Zulässigkeit von bit-Spalten ohne explizite NULL-Zulässigkeit wird durch die Sitzungseinstellung von SET ANSI_NULL_DFLT_ON oder SET ANSI_NULL_DFLT_OFF oder durch die Datenbankeinstellung von SET ANSI NULL DEFAULT festgelegt. Weitere Informationen finden Sie unter SET (Transact-SQL).

Die ALTER COLUMN-Klausel kann nicht mit ALTER TABLE verwendet werden.

Die ALTER COLUMN-Klausel kann mit ALTER TABLE verwendet werden. Weitere Informationen finden Sie unter ALTER TABLE (Transact-SQL).

Ein für eine Tabelle erstellter Trigger ersetzt vorhandene Trigger desselben Typs (INSERT, UPDATE, DELETE). Mit der Option WITH APPEND von CREATE TRIGGER können mehrere Trigger desselben Typs erstellt werden.

Trigger desselben Typs werden angefügt. Triggernamen müssen eindeutig sein. Standardmäßig wird die Option WITH APPEND verwendet. Weitere Informationen finden Sie unter CREATE TRIGGER (Transact-SQL).

Wenn ein Batch oder eine Prozedur ungültige Objektnamen enthält, wird beim Analysieren oder Kompilieren des Batches eine Warnung zurückgegeben, und beim Ausführen des Batches wird eine Fehlermeldung zurückgegeben.

Bei einem ungültigen lokalen Objekt wird beim Analysieren oder Kompilieren des Batches keine Warnung zurückgegeben; beim Ausführen des Batches wird eine Fehlermeldung zurückgegeben.

Beim einem ungültigen Remoteobjekt wird die verzögerte Namensauflösung (DNR, Deferred Name Resolution) jedoch nicht unterstützt. Wenn eine ungültige Remotetabelle in einer Prozedur verwendet wird, erzeugt die Prozedurerstellung einen Fehler, und es wird ein Fehler zurückgegeben.

ms178653.note(de-de,SQL.90).gifHinweis:

Die DNR-Unterstützung (die Fähigkeit, beim Kompilieren auf Objekte zu verweisen, die erst zur Ausführungszeit vorhanden sind) gilt nur für Tabellen- oder Sichtnamen. Weitere Informationen zur verzögerten Namensauflösung finden Sie unter CREATE PROCEDURE (Transact-SQL).

Abfragen im folgenden Format werden ordnungsgemäß ausgeführt, indem die Y-Tabelle ignoriert und die Ergebnisse der SELECT-Anweisung in die X-Tabelle eingefügt werden.

INSERT X
SELECT select_list INTO Y

Microsoft SQL Server, Version 7.0 oder höher, gibt einen Syntaxfehler zurück, wenn dieselbe Abfrage ausgeführt wird.

Das Literal für die leere Zeichenfolge (' ') wird als einzelnes Leerzeichen ausgewertet:

Das Literal für die leere Zeichenfolge (' ') wird als leere Zeichenfolge ausgewertet.

DATALENGTH('') gibt 1 zurück ('' wird als einzelnes Leerzeichen analysiert).

DATALENGTH(N'') gibt 2 zurück (N'' wird als einzelnes Unicode-Leerzeichen analysiert).

DATALENGTH('') gibt 0 zurück.

DATALENGTH(N'') gibt 0 zurück.

LEFT('123', 0) gibt NULL zurück.

LEFT(N'123', 0) gibt NULL zurück.

LEFT('123', 0) gibt eine leere Zeichenfolge zurück.

LEFT(N'123', 0) gibt eine leere Zeichenfolge zurück.

LTRIM(' ') gibt NULL zurück.

LTRIM(N'     ') gibt NULL zurück.

LTRIM(' ') gibt eine leere Zeichenfolge zurück.

LTRIM(N'     ') gibt eine leere Zeichenfolge zurück.

REPLICATE('123', 0) gibt NULL zurück.

REPLICATE(N'123', 0) gibt NULL zurück.

REPLICATE('123', 0) gibt eine leere Zeichenfolge zurück.

REPLICATE(N'123', 0) gibt eine leere Zeichenfolge zurück.

RIGHT(N'123', 0) gibt NULL zurück. RIGHT('123', 0) gibt NULL zurück.

RIGHT('123', integer_expression) gibt NULL zurück, wenn integer_expression negativ ist.

RIGHT(N'123', integer_expression) gibt NULL zurück, wenn integer_expression negativ ist.

RIGHT('123', 0) gibt eine leere Zeichenfolge zurück.

RIGHT(N'123', 0) gibt eine leere Zeichenfolge zurück.

RIGHT('123', integer_expression) gibt einen Fehler zurück, wenn integer_expression negativ ist. RIGHT(N'123', integer_expression) gibt einen Fehler zurück, wenn integer_expression negativ ist.

RTRIM(' ') gibt NULL zurück.

RTRIM(N'     ') gibt NULL zurück.

RTRIM(' ') gibt eine leere Zeichenfolge zurück.

RTRIM(N'     ') gibt eine leere Zeichenfolge zurück.

SPACE(0) gibt NULL zurück.

SPACE(0) gibt eine leere Zeichenfolge zurück.

Die Funktion SUBSTRING(expression, start, length) gibt NULL zurück, wenn für start ein Wert angegeben wird, der größer als die Anzahl von Zeichen in expression ist*,* oder wenn length gleich Null ist. SUBSTRING(N'123', 4, 1) gibt beispielsweise NULL zurück.

Unter identischen Bedingungen gibt SUBSTRING(expression, start, length) eine leere Zeichenfolge zurück, die durch ein Paar von einfachen Anführungszeichen getrennt ist; SUBSTRING(N'123', 4, 1) gibt z. B. '' zurück.

UPDATETEXT table.textcolumn textpointer 0 NULL NULL ergibt einen NULL-Wert.

UPDATETEXT table.textcolumn textpointer 0 NULL NULL ergibt eine leere Zeichenfolge.

Die Funktionen CHARINDEX und PATINDEX geben nur dann NULL zurück, wenn sowohl das Muster als auch der Ausdruck NULL sind.

Die Funktionen CHARINDEX und PATINDEX geben NULL zurück, wenn Eingabeparameter NULL sind.

Verweise auf text- oder image-Spalten in den Tabellen inserted und deleted werden als NULL angezeigt.

Verweise auf text- oder image-Spalten in den Tabellen inserted und deleted sind nicht zulässig.

Beim Abrufen von text- oder image-Spalten aus der inserted- oder deleted-Tabelle innerhalb eines Triggers werden NULL-Werte für text- oder image-Spalten zurückgegeben.

Das Abrufen von text- oder image-Spalten aus der inserted- oder deleted-Tabelle innerhalb eines Triggers ist nicht zulässig und verursacht einen Fehler.

UPDATETEXT kann text-Spalten mit NULL initialisieren.

UPDATETEXT initialisiert text-Spalten mit einer leeren Zeichenfolge.

WRITETEXT initialisiert text-Spalten mit NULL.

Die concatenation of null yields null-Einstellung von sp_dboption ist deaktiviert. Dadurch wird eine leere Zeichenfolge zurückgegeben, wenn ein beliebiger Operand in einem Verkettungsvorgang NULL ist.

Die concatenation of null yields null-Einstellung von sp_dboption ist aktiviert. Dadurch wird NULL zurückgegeben, wenn ein beliebiger Operand in einem Verkettungsvorgang NULL ist.

In einer INSERT-Anweisung ist in der VALUES-Klausel eine SELECT-Anweisung zulässig, die einen skalaren Wert zurückgibt.

Für die INSERT-Anweisung ist in der VALUES-Klausel keine SELECT-Anweisung als einer der einzufügenden Werte zulässig.

Eine ROLLBACK-Anweisung in einer gespeicherten Prozedur, auf die in einer INSERT table EXEC procedure-Anweisung verwiesen wird, bewirkt das Ausführen eines Rollbacks für die INSERT-Anweisung. Der Batch wird jedoch weiter ausgeführt.

Eine ROLLBACK-Anweisung in einer gespeicherten Prozedur, auf die in einer INSERT...EXEC-Anweisung verwiesen wird, bewirkt das Ausführen eines Rollbacks für die gesamte Transaktion und das Beenden der Ausführung des Batches.

Unterschiede zwischen niedrigeren Kompatibilitätsgraden und Kompatibilitätsgrad 90

In diesem Unterabschnitt werden neue mit Kompatibilitätsgrad 90 eingeführte Verhaltensweisen beschrieben. Weitere Verhaltensunterschiede, die den Kompatibilitätsgrad 80 und darunter betreffen, finden Sie im Abschnitt "Reservierte Schlüsselwörter" weiter unten in diesem Thema.

Die Verwendung des Kompatibilitätsgrads 90 kann zu den im Folgenden beschriebenen Verhaltensänderungen führen.

Kompatibilitätsgradeinstellung 80 oder niedriger

Kompatibilitätsgradeinstellung 90

Mögliche Auswirkung

Bei Sperrhinweisen in der FROM-Klausel ist das WITH-Schlüsselwort immer optional.

Bis auf einige Ausnahmen werden Tabellenhinweise nur dann in der FROM-Klausel unterstützt, wenn die Hinweise mit dem WITH-Schlüsselwort angegeben werden. Weitere Informationen finden Sie unter FROM (Transact-SQL).

Hoch

Die Operatoren *= und =* für äußere Verknüpfungen werden unterstützt, es wird jedoch eine Warnmeldung ausgegeben.

Diese Operatoren werden nicht unterstützt. Stattdessen sollte das OUTER JOIN-Schlüsselwort verwendet werden.

Hoch

Werden die Spaltenverweise in der ORDER BY-Liste an die durch die SELECT-Liste definierten Spalten gebunden, werden Spaltenmehrdeutigkeiten ignoriert. Spaltenpräfixe werden manchmal ignoriert. Möglicherweise wird dadurch das Resultset in einer unerwarteten Reihenfolge zurückgegeben.

Beispielsweise wird eine ORDER BY-Klausel mit einer einzelnen zweiteiligen Spalte (<table_alias>.<column>), die als Verweis auf eine Spalte in einer SELECT-Liste verwendet wird, angenommen, der Tabellenalias jedoch ignoriert. Betrachten Sie die folgende Abfrage.

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

Bei der Ausführung wird das Spaltenpräfix in der ORDER BY-Klausel ignoriert. Der Sortiervorgang wird nicht wie erwartet für die angegebene Quellspalte (x.c1) ausgeführt, sondern für die abgeleitete c1-Spalte, die in der Abfrage definiert wird. Der Ausführungsplan für die Abfrage zeigt, dass zunächst die Werte für die abgeleitete Spalte berechnet werden und dann die berechneten Werte sortiert werden.

Eine Spaltenmehrdeutigkeit löst einen Fehler aus. Wenn eine Bindung an eine Spalte erfolgt, die in der SELECT-Liste definiert ist, werden in ORDER BY angegebene Spaltenpräfixe nicht ignoriert.

Betrachten Sie die folgende Abfrage.

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

Bei der Ausführung wird das Spaltenpräfix in der ORDER BY-Klausel nicht ignoriert. Der Sortiervorgang findet wie erwartet für die angegebene Quellspalte (x.c1) statt. Der Ausführungsplan für die Abfrage zeigt, dass die von t_table zurückgegebenen Zeilen vom Sortieroperator geordnet werden und dann die Werte für die abgeleitete c1-Spalte, die in der SELECT-Liste definiert ist, berechnet werden.

Mittel

In einer aus einer Vereinigung aus unterschiedlichen Datentypen bestehenden INSERT SELECT-Anweisung wird jeder UNION-Zweig direkt in den Datentyp der Zielspalte der INSERT-Anweisung konvertiert. Auch wenn die Vereinigung für sich genommen aufgrund inkompatibler Typkonvertierungen einen Fehler erzeugen könnte, bewirkt INSERT SELECT, dass UNION erfolgreich ist, da der Zweig zum Ergebnistyp des UNION-Vorgangs nie konvertiert wird.

In SQL Server 2005 wird der Ergebnistyp des UNION-Vorgangs unabhängig von INSERT SELECT abgeleitet. Jeder UNION-Zweig wird erst in den Ergebnistyp des UNION-Vorgangs und dann in den Datentyp der Zielspalte von INSERT konvertiert. Wenn der UNION-Vorgang inkompatible Typen einschließt, kann die ersten Datentypkonvertierung zu einem Fehler führen. Für ein Ausführen mit dem Kompatibilitätsgrad 90 müssen Sie alle inkompatiblen Typvereinigungen beheben, die innerhalb von INSERT SELECT verwendet werden.

Mittel

Einfüge- und Aktualisierungsvorgänge über eine Sicht werden für Sichten, in denen die WITH CHECK OPTION-Klausel angegeben wird, nicht ordnungsgemäß unterstützt, wenn für die Sicht oder für eine Sicht, auf die verwiesen wird, die TOP-Klausel verwendet wird.

Einfüge- und Aktualisierungsvorgänge über eine Sicht werden für Sichten nicht unterstützt, in denen WITH CHECK OPTION verwendet wird, wenn für die Sicht oder für eine Sicht, auf die verwiesen wird, die TOP-Klausel verwendet wird.

Mittel

Durch die Vereinigung (mithilfe von UNION) einer Spalte variabler Länge und einer Spalte fester Länge wird eine Spalte fester Länge erzeugt.

Durch die Vereinigung (mithilfe von UNION) einer Spalte variabler Länge und einer Spalte fester Länge wird eine Spalte variabler Länge erzeugt.

Mittel

SET XACT_ABORT OFF ist innerhalb eines Triggers zulässig.

SET XACT_ABORT OFF ist innerhalb eines Triggers nicht zulässig.

Mittel

Die FOR BROWSE-Klausel ist in Sichten zulässig (und wird ignoriert).

Die FOR BROWSE-Klausel ist in Sichten nicht zulässig.

Mittel

Domänenfehler werden nicht von ANSI_WARNINGS gesteuert. ARITHABORT-Einstellungen werden berücksichtigt, wenn ANSI_WARNINGS auf OFF festgelegt ist und die ARITHABORT-Einstellung nicht geändert wird.

Domänenfehler werden auch von ANSI_WARNINGS gesteuert und werden als Fehler mit dem Schweregrad 16 behandelt. Wenn entweder ANSI_WARNINGS oder ARITHABORT auf ON festgelegt ist, wird kein NULL-Wert zurückgegeben, sondern ein Fehler ausgelöst. Benutzerskripts, die davon abhängen, dass ARITHABORT auf OFF festgelegt ist, können durch diese Änderung unbrauchbar werden.

Mittel

Wenn eine Pass-Through-Abfrage für eine Remotedatenquelle [OpenRowset oder OpenQuery] Spalten mit doppelten Namen erzeugt, werden die doppelten Spaltennamen ignoriert, sofern die Spalten nicht explizit in der Abfrage benannt wurden.

Wenn eine Pass-Through-Abfrage für eine Remotedatenquelle [OpenRowset oder OpenQuery] Spalten mit doppelten Namen erzeugt, wird ein Fehler ausgelöst.

Niedrig

Zeichenfolgenkonstanten und varbinary-Konstanten mit mehr als 8000 Zeichen werden als Werte des Typs text, ntext oder image behandelt.

Zeichenfolgenkonstanten und varbinary-Konstanten mit mehr als 8000 Zeichen werden als Werte des Typs varchar(max) (oder nvarchar(max) bzw. varbinary(max)) behandelt. Hierdurch kann sich der Datentyp der mithilfe von SELECT … INTO erstellten Tabelle ändern, wenn die SELECT-Liste derartige Ausdrücke enthält.

Niedrig

Vergleiche zwischen numerischen Typen (smallint, tinyint, int, bigint, numeric, decimal, smallmoney, money) werden durchgeführt, indem der Vergleichswert mit der niedrigeren Rangfolge in der Typhierarchie in den Typ mit höherer Rangfolge konvertiert wird.

Werte eines numerischen Typs werden ohne Konvertierung verglichen. Hierdurch wird die Leistung verbessert. Dies kann jedoch zu einigen Verhaltensänderungen führen, insbesondere in Fällen, bei denen die Konvertierung zu einem Überlauf geführt hat.

Niedrig

Integrierte Metadatenfunktionen, die Zeichenfolgenargumente verwenden, schneiden die Eingabe ab, wenn diese mehr als 4000 Zeichen umfasst.

Integrierte Metadatenfunktionen lösen einen Fehler aus, wenn das Abschneiden zu einem Verlust von Zeichen führen würde, die keine Leerzeichen sind.

Niedrig

Die Menge nicht zulässiger Zeichen in einem Bezeichner ohne Anführungszeichen bleibt unverändert.

Der Transact-SQL-Parser unterstützt den Standard Unicode 3.2. Dadurch ändert sich die Zeichenklassifizierung für einige internationale Zeichen, die zurzeit in nicht begrenzten Bezeichnern nicht zulässig sind.

Niedrig

SET ANSI_WARNINGS ON setzt die Einstellung SET ARITHABORT OFF im Falle von Gleitkomma-Domänenfehlern, d. h. bei negativen Argumenten für die log()-Funktion, nicht außer Kraft. Wenn ANSI_WARNINGS auf ON, ARITHABORT jedoch auf OFF festgelegt ist, führen Gleitkomma-Domänenfehler nicht zu einer Beendigung der Abfrage.

SET ANSI_WARNINGS ON setzt die Einstellung ARITHABORT OFF vollständig außer Kraft. In diesem Fall führen Gleitkomma-Domänenfehler zu einer Beendigung der Abfrage.

Niedrig

Nicht ganzzahlige Konstanten in der ORDER BY-Klausel sind zulässig (und werden ignoriert).

Nicht ganzzahlige Konstanten in der ORDER BY-Klausel sind nicht zulässig.

Niedrig

Leere SET-Anweisungen (ohne Zuweisung von SET-Optionen) sind zulässig.

Leere SET-Klauseln sind nicht zulässig.

Niedrig

Das IDENTITY-Attribut wird für Spalten, die durch eine abgeleitete Tabelle erstellt werden, nicht ordnungsgemäß abgeleitet.

Das IDENTITY-Attribut wird für Spalten, die durch abgeleitete Tabellen erstellt werden, ordnungsgemäß abgeleitet.

Niedrig

Die Eigenschaft, die die NULL-Zulässigkeit für Ergebnisse arithmetischer Operatoren bestimmt, die auf Daten des Gleitkommadatentyps angewendet werden, ist immer so festgelegt, dass NULL-Werte zulässig sind.

Die Eigenschaft, die die NULL-Zulässigkeit für Ergebnisse arithmetischer Operatoren bestimmt, die auf Daten des Gleitkommadatentyps angewendet werden, gibt an, dass NULL-Werte unzulässig sind, wenn die Eingaben keine NULL-Werte zulassen und ANSI_WARNINGS auf ON festgelegt ist.

Niedrig

In einer INSERT .. SELECT-Anweisung, die den UNION-Operator verwendet, werden alle Datentypen, die durch die einzelnen Resultsets erstellt werden, in den Datentyp der Zieltabelle konvertiert.

In einer INSERT .. SELECT-Anweisung, die den UNION-Operator verwendet, wird der vorherrschende Datentyp der verschiedenen Zweige festgelegt. Die Ergebnisse werden in diesen Typ konvertiert, bevor sie in den Datentyp der Zieltabelle konvertiert werden.

Niedrig

In einer SELECT .. FOR XML-Anweisung werden die Hexadezimalwerte 27 (das Zeichen ') und 22 (das Zeichen ") immer in Entitäten geändert, auch dann, wenn dies nicht erforderlich ist.

Durch FOR XML werden die Hexadezimalwerte 27 und 22 nur dann in Entitäten geändert, wenn dies erforderlich ist. In den folgenden Situationen erfolgt keine Änderung in Entitäten:

  • Bei Attributinhalten wird der Hexadezimalwert 27 (das Zeichen ') nicht in eine Entität geändert, wenn die Attributwerte durch " begrenzt werden; der Hexadezimalwert 22 (das Zeichen ") wird nicht in eine Entität geändert, wenn die Attributwerte durch ' begrenzt werden.
  • Bei Elementinhalten werden die Hexadezimalwerte nie in Entitäten geändert.

Niedrig

In FOR XML wird der Timestampwert einer ganzen Zahl zugeordnet.

In FOR XML wird der Timestampwert einem Binärwert zugeordnet.

Weitere Informationen finden Sie unter FOR XML-Unterstützung für den timestamp-Datentyp.

Hoch (wenn eine timestamp-Spalte verwendet wird), andernfalls Niedrig

In FOR XML und OPENXML werden in Namen verwendete Unicode-Zeichen mit hohen Hexadezimalwerten (3 Bytes) mithilfe von 8 Positionen dargestellt.

So stellt FOR XML beispielsweise den Unicode-Codepunkt U+10000 mithilfe von 8 Positionen folgendermaßen dar:

<a_x00010000_ c1="1" />

In FOR XML und OPENXML werden in Namen verwendete Unicode-Zeichen mit hohen Hexadezimalwerten (3 Bytes) mithilfe von 6 Positionen dargestellt.

So stellt FOR XML beispielsweise den Unicode-Codepunkt U+10000 mithilfe von 6 Positionen folgendermaßen dar:

<a_x010000_ c1="1" />

Niedrig

In FOR XML sind Zuordnungen abgeleiteter Tabellen im AUTO-Modus nicht sichtbar.

Beispiel:

USE AdventureWorks
CREATE TABLE Test(id int);
INSERT INTO Test VALUES(1);
INSERT INTO Test VALUES(2);
SELECT * FROM (SELECT a.id AS a, 
b.id AS b FROM Test a 
JOIN Test b ON a.id=b.id) 
Test FOR XML AUTO;

Wenn der Kompatibilitätsgrad für AdventureWorks auf 80 festgelegt wird, wird im vorherigen Beispiel Folgendes erstellt:

<a a="1"><b b="1"/></a>

<a a="2"><b b="2"/></a>

In FOR XML sind Zuordnungen abgeleiteter Tabellen im AUTO-Modus sichtbar.

Wenn der Kompatibilitätsgrad für AdventureWorks auf 90 festgelegt wird, wird im vorherigen Beispiel Folgendes erstellt:

<Test a="1" b="1"/>

<Test a="2" b="2"/>

Weitere Informationen zu Änderungen am AUTO-Modus finden Sie unter Verbesserungen des AUTO-Modus.

Hoch (wenn der FOR XML AUTO-Modus auf Sichten angewendet wird), andernfalls Niedrig

Konvertierungen von Zeichenfolgen in money-Werte unterstützen den umgekehrten Schrägstrich (\) als Währungssymbol nur für die Sprachen Japanisch und Koreanisch.

Der umgekehrte Schrägstrich (\) wird bei allen Konvertierungen von Zeichenfolgen in money-Werte in allen Sprachen angenommen. ISNUMERIC würde TRUE zurückgeben, wenn \ als Währungssymbol verwendet wird.

Bei Datenbanken in SQL Server-Versionen vor SQL Server 2005 bewirkt dieses neue Verhalten, dass Indizes und berechnete Spalten unterbrochen werden, die von einem ISNUMERIC-Rückgabewert für eine Zeichenfolge mit dem Zeichen \ abhängen und deren Sprache weder Japanisch noch Koreanisch ist.

Niedrig

Bei dem Ergebnis eines arithmetischen Operators sind NULL-Werte immer zulässig, und zwar auch dann, wenn NULL-Werte für die Operanden nicht zulässig sind und ANSI_WARNINGS oder ARITHABORT auf ON festgelegt ist.

Wenn ANSI_WARNINGS oder ARITHABORT auf ON festgelegt ist, sind NULL-Werte für das Ergebnis eines arithmetischen Gleitkommaoperators nicht zulässig, wenn beide Operanden keine NULL-Werte zulassen.

Diese Änderung bei der NULL-Zulässigkeit könnte zu Fehlern führen, wenn bcp für den Massenexport von Daten im Binärformat aus einer SQL Server 2000-Tabelle mit einer berechneten Spalte verwendet wird, die einen arithmetischen Gleitkommaoperator verwendet, und bcp oder BULK INSERT dann für den Massenimport dieser Daten in eine SQL Server 2005-Tabelle mit derselben Definition verwendet wird.

ms178653.note(de-de,SQL.90).gifHinweis:

Wenn beide Optionen auf OFF festgelegt sind, legt Datenbankmodul für das Ergebnis fest, dass es NULL-Werte zulässt. Dies entspricht dem Verhalten in SQL Server 2000.

Niedrig Wenn in SQL Server 2000 ein größerer Wert übergeben wird, wird dieser ohne Hinweis abgeschnitten.

Bei integrierten Funktionen, die einen nvarchar-Wert als Parameter verwenden, wird der Wert ebenfalls in einen nvarchar(4000)-Wert konvertiert, wenn der bereitgestellte Wert ein varchar-Wert ist. Wird jedoch ein größerer Wert übergeben, generiert SQL Server 2005 einen Fehler.

Für die Ausführung mit dem Kompatibilitätsgrad 90 müssen Sie benutzerdefinierten Code, der das Abschneiden zu großer Werte voraussetzt, korrigieren.

Niedrig

Bei der Vereinigung einer Zeichenfolge fester Länge (char, binary oder nchar) mit einer Zeichenfolge variabler Länge (varchar, varbinary, nvarchar) wird ein Ergebnis fester Länge zurückgegeben.

Bei der Vereinigung einer Zeichenfolge variabler Länge mit einer Zeichenfolge fester Länge wird eine Zeichenfolge variabler Länge zurückgegeben.

Für die Ausführung mit dem Kompatibilitätsgrad 90 müssen Sie alle Elemente (Indizes, Abfragen und berechnete Spalten) korrigieren, die von dem Ergebnistyp der Vereinigung eines Typs variabler Länge mit einem Typ fester Länge abhängen.

Niedrig

Objektnamen, die das Zeichen 0xFFFF enthalten, sind gültige Bezeichner.

Objektnamen, die das Zeichen 0xFFFF enthalten, sind keine gültigen Bezeichner. Der Zugriff darauf ist nicht möglich.

Für die Ausführung mit dem Kompatibilitätsgrad 90 müssen Sie Objekte umbenennen, die dieses Zeichen enthalten.

Niedrig

In SELECT ISNUMERIC('<string>') sind eingebettete Kommas innerhalb von <string> signifikant.

Beispielsweise gibt die folgende SELECT ISNUMERIC('121212,12')-Abfrage 0 zurück. Dieses Ergebnis zeigt an, dass die Zeichenfolge 121212,12 nicht numerisch ist.

In SELECT ISNUMERIC('<string>') werden eingebettete Kommas innerhalb von <string> ignoriert.

Beispielsweise gibt die folgende SELECT ISNUMERIC('121212,12')-Abfrage 1 zurück. Dieses Ergebnis zeigt an, dass die Zeichenfolge 121212,12 numerisch ist.

Niedrig

Ein Doppelpunkt (:) nach einem reservierten Schlüsselwort in einer Transact-SQL-Anweisung wird ignoriert.

Ein Doppelpunkt (:) nach einem reservierten Schlüsselwort in einer Transact-SQL-Anweisung verursacht einen Fehler bei der Anweisung.

Niedrig

Eine GROUP BY-Klausel in einer Unterabfrage, die auf eine Spalte aus der äußeren Abfrage verweist, ist erfolgreich.

Eine GROUP BY-Klausel in einer Unterabfrage, die auf eine Spalte aus der äußeren Abfrage verweist, gibt dem SQL-Standard entsprechend einen Fehler zurück.

Niedrig

Reservierte Schlüsselwörter

Die Kompatibilitätseinstellung bestimmt außerdem die für Datenbankmodul reservierten Schlüsselwörter. In der folgenden Tabelle sind die reservierten Schlüsselwörter aufgeführt, die mit den einzelnen Kompatibilitätsgraden eingeführt werden.

Einstellung für den Kompatibilitätsgrad Reservierte Schlüsselwörter

90

EXTERNAL, PIVOT, UNPIVOT, REVERT, TABLESAMPLE

80

COLLATE, FUNCTION, OPENXML

70

BACKUP, CONTAINS, CONTAINSTABLE, DENY, FREETEXT, FREETEXTTABLE, PERCENT, RESTORE, ROWGUIDCOL, TOP

65

AUTHORIZATION, CASCADE, CROSS, DISTRIBUTED, ESCAPE, FULL, INNER, JOIN, LEFT, OUTER, PRIVILEGES, RESTRICT, RIGHT, SCHEMA, WORK

Bei einem bestimmten Kompatibilitätsgrad schließen die reservierten Schlüsselwörter alle Schlüsselwörter ein, die mit diesem oder einem niedrigeren Grad eingeführt wurden. So stellen z. B. bei Anwendungen mit dem Kompatibilitätsgrad 90 alle in der vorherigen Tabelle aufgeführten Schlüsselwörter reservierte Schlüsselwörter dar. Bei den niedrigeren Kompatibilitätsgraden stellen die Schlüsselwörter von Grad 90 weiterhin gültige Objektnamen dar; die Sprachfeatures von Grad 90, die diesen Schlüsselwörtern entsprechen, sind jedoch nicht verfügbar.

Nach der Einführung bleibt ein Schlüsselwort reserviert. So stellt z. B. das reservierte Schlüsselwort BACKUP, das mit Kompatibilitätsgrad 70 eingeführt wurde, auch bei Grad 80 und 90 ein reserviertes Schlüsselwort dar.

Wenn eine Anwendung einen Bezeichner verwendet, der für den Kompatibilitätsgrad der Anwendung als Schlüsselwort reserviert ist, erzeugt die Anwendung einen Fehler. Sie können dies umgehen, indem Sie den Bezeichner in eckige Klammern ([]) oder Anführungszeichen ("") einschließen. Wenn Sie z. B. eine Anwendung, die den Bezeichner EXTERNAL verwendet, auf den Kompatibilitätsgrad 90 aktualisieren möchten, können Sie den Bezeichner entweder in [EXTERNAL] oder "EXTERNAL" ändern.

Berechtigungen

Nur der Datenbankbesitzer sowie Mitglieder der festen Serverrolle sysadmin und der festen Datenbankrolle db_owner (wenn Sie die aktuelle Datenbank ändern) können diese Prozedur ausführen.

Beispiele

A. Ändern des Kompatibilitätsgrads in SQL Server 2000

Im folgenden Beispiel wird der Kompatibilitätsgrad der AdventureWorks-Datenbank in 80 geändert.

EXEC sp_dbcmptlevel AdventureWorks, 80;
GO

B. Auswirkung des Kompatibilitätsgrads auf ORDER BY (Szenario 1)

Im folgenden Beispiel wird der Unterschied bei der ORDER BY-Bindung für die Kompatibilitätsgrade 80 und 90 veranschaulicht. In dem Beispiel wird die Beispieltabelle SampleTable in der tempdb-Datenbank erstellt.

USE tempdb;
CREATE TABLE SampleTable(c1 int, c2 int);
GO

Beim Kompatibilitätsgrad 90 (Standardeinstellung) generiert die folgende SELECT... ORDER BY-Anweisung einen Fehler, da der Spaltenname in der AS-Klausel (c1) mehrdeutig ist.

SELECT c1, c2 AS c1
    FROM SampleTable
    ORDER BY c1;
GO

Nachdem der Kompatibilitätsgrad der Datenbank auf 80 festgelegt wurde, wird dieselbe SELECT... ORDER BY-Anweisung erfolgreich ausgeführt.

sp_dbcmptlevel tempdb, 80
SELECT c1, c2 AS c1
    FROM SampleTable
    ORDER BY c1;
GO

Die folgende SELECT... ORDER BY-Anweisung ist bei beiden Kompatibilitätsgraden funktionsfähig.

sp_dbcmptlevel tempdb, 80
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO

sp_dbcmptlevel tempdb, 90
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO

C. Auswirkung des Kompatibilitätsgrads auf ORDER BY (Szenario 2)

Beim Kompatibilitätsgrad 90 (Standardeinstellung) generiert die folgende SELECT...ORDER BY-Anweisung einen Fehler, da in der ORDER BY-Klausel ein weiteres Präfix angegeben ist.

SELECT c1 AS x
    FROM SampleTable
    ORDER BY SampleTable.x;
GO

Nachdem der Kompatibilitätsgrad der Datenbank auf 80 festgelegt wurde, wird dieselbe SELECT...ORDER BY-Anweisung erfolgreich ausgeführt.

sp_dbcmptlevel tempdb, 80
SELECT c1 AS x
    FROM SampleTable
    ORDER BY SampleTable.x;
GO

Die folgende SELECT...ORDER BY-Anweisung ist bei beiden Kompatibilitätsgraden funktionsfähig.

sp_dbcmptlevel tempdb, 80
SELECT c1 AS x
    FROM SampleTable
    ORDER BY x;
GO
sp_dbcmptlevel tempdb, 90
SELECT c1 AS x
    FROM SampleTable
    ORDER BY x;
GO

Siehe auch

Verweis

Gespeicherte Prozeduren für das Datenbankmodul (Transact-SQL)
ALTER DATABASE (Transact-SQL)
ALTER TABLE (Transact-SQL)
CREATE PROCEDURE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
EXECUTE (Transact-SQL)
Reservierte Schlüsselwörter (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)
Gespeicherte Systemprozeduren (Transact-SQL)
UPDATE (Transact-SQL)

Andere Ressourcen

Datenbank-Kompatibilitätsgrad (Option)
Neue FOR XML-Features
Festlegen von Datenbankoptionen
Verwenden von Optionen in SQL Server

Hilfe und Informationen

Informationsquellen für SQL Server 2005

Änderungsverlauf

Version Verlauf

17. Juli 2006

Geänderter Inhalt:
  • Die Anweisung "Der Kompatibilitätsgrad der master-Datenbank kann nicht geändert werden" wurde entfernt.

14. April 2006

Neuer Inhalt:
  • Der Abschnitt mit bewährten Methoden wurde hinzugefügt.
  • Text zum Verhalten von GROUP BY in einer Unterabfrage wurde hinzugefügt.