sp_dbcmptlevel (Transact-SQL)

Mis à jour : 17 juillet 2006

Définit certains comportements de base de données pour qu'ils soient compatibles avec la version de SQL Server spécifiée.

Icône Lien de rubriqueConventions de syntaxe Transact-SQL

Syntaxe

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

Arguments

  • @dbname= ] name
    Nom de la base de données dont le niveau de compatibilité doit être modifié. Les noms de bases de données doivent être conformes aux règles relatives aux identificateurs. name est de type sysname et sa valeur par défaut est NULL.
  • @new_cmptlevel= ] version
    Version de SQL Server avec laquelle la base de données doit être compatible. version est de type tinyint et sa valeur par défaut est NULL. La valeur doit être l'une des suivantes :

    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(fr-fr,SQL.90).gifRemarque :
    Les valeurs 60 et 65 sont abandonnées et seront supprimées dans une version ultérieure.
    ms178653.Caution(fr-fr,SQL.90).gifAttention :
    SQL Server Management Studio et SQL Server Management Objects (SMO) ne prennent pas en charge le niveau de compatibilité 60. Si vous utilisez SMO ou Management Studio avec une base de données dont le niveau de compatibilité a la valeur 60, certaines opérations génèrent des erreurs.

Jeux de résultats

Si aucun paramètre n'est spécifié ou si le paramètre name n'est pas spécifié, sp_dbcmptlevel retourne une erreur.

Si name est spécifié sans version, le moteur de base de données de SQL Server 2005 retourne un message affichant le niveau de compatibilité actuel de la base de données spécifiée.

Notes

Pour toutes les installations de SQL Server 2005, le niveau de compatibilité par défaut a la valeur 90. C'est le niveau défini pour les bases de données créées dans SQL Server 2005 sauf si le niveau de compatibilité de la base de données model est inférieur. Lorsqu'une base de données est mise à niveau vers SQL Server 2005 à partir d'une version antérieure de SQL Server, la base de données conserve son niveau de compatibilité existant. C'est le cas aussi bien pour les bases de données système que pour les bases de données utilisateur. Utilisez sp_dbcmptlevel pour modifier la valeur du niveau de compatibilité de la base de données sur 90. Pour afficher le niveau de compatibilité actuel d'une base de données, interrogez la colonne compatibility_level de l'affichage catalogue sys.databases.

Utilisation de sp_dbcmptlevel à des fins de compatibilité descendante

La procédure stockée sp_dbcmptlevel affecte uniquement les comportements de la base de données spécifiée, et non ceux de l'ensemble du serveur. sp_dbcmptlevel ne fournit qu'une compatibilité descendante partielle avec des versions antérieures de SQL Server. Utilisez sp_dbcmptlevel en tant qu'aide à la migration provisoire pour résoudre les différences de version dans les comportements qui sont contrôlés par le paramètre de niveau de compatibilité pertinent. Si des applications SQL Server existantes sont affectées par des différences de comportement dans SQL Server 2005, convertissez l'application de sorte qu'elle fonctionne correctement. Utilisez ensuite sp_dbcmptlevel pour modifier la valeur du niveau de compatibilité sur 90. Le nouveau paramètre de compatibilité d'une base de données prend effet lorsque la base de données devient la base de données active (qu'il s'agisse de la base de données par défaut lors de la connexion ou qu'elle soit spécifiée dans une instruction USE).

Une base de données contenant une vue indexée ne peut pas être modifiée avec un niveau de compatibilité inférieur à 80.

Meilleures pratiques

La modification du niveau de compatibilité pendant que des utilisateurs sont connectés à la base de données risque de générer des jeux de résultats incorrects pour les requêtes actives. Par exemple, si le niveau de compatibilité change pendant la compilation d'un plan de requête, le plan compilé peut reposer à la fois sur l'ancien niveau de compatibilité et sur le nouveau, ce qui aboutit à un plan incorrect et à des résultats potentiellement imprécis. Le problème risque par ailleurs de s'aggraver si le plan est placé dans le cache du plan et est réutilisé pour les requêtes suivantes. Pour éviter que les requêtes ne donnent des résultats inexacts, nous vous recommandons de suivre la procédure ci-dessous pour modifier le niveau de compatibilité d'une base de données :

  1. Définissez la base de données en mode d'accès mono-utilisateur à l'aide de ALTER DATABASE SET SINGLE_USER.
  2. Modifiez le niveau de compatibilité de la base de données.
  3. Définissez la base de données en mode d'accès multi-utilisateur à l'aide de ALTER DATABASE SET MULTI_USER.
  4. Pour plus d'informations sur la définition du mode d'accès d'une base de données, consultez ALTER DATABASE (Transact-SQL).

Options SET

Les nouvelles fonctionnalités peuvent fonctionner avec des niveaux de compatibilité plus anciens, mais les options SET nécessitent quelques ajustements. L'utilisation, par exemple, du type de données xml avec le niveau de compatibilité 80 requiert des options ANSI SET appropriées. Lorsque le niveau de compatibilité de la base de données a la valeur 90 et que vous affectez ON à ANSI_WARNINGS, ON est implicitement affecté à ARITHABORT. Si le niveau de compatibilité de la base de données a une valeur inférieure ou égale à 80, ON doit être explicitement affecté à l'option ARITHABORT. Pour plus d'informations, consultez Options SET affectant les résultats.

Niveaux de compatibilité et procédures stockées

Lors de l'exécution d'une procédure stockée, celle-ci utilise le niveau de compatibilité actuel de la base de données dans laquelle elle est définie. Lors de la modification du paramètre de compatibilité d'une base de données, l'ensemble de ses procédures stockées sont automatiquement recompilées en conséquence.

Considérations relatives à l'environnement pour l'utilisation de sp_dbcmptlevel

Chaque appel de sp_dbcmptlevel doit être soumis individuellement. sp_dbcmptlevel ne peut pas être appelé à partir des autres contextes suivants :

  • une procédure stockée ;
  • une chaîne Transact-SQL exécutée avec la syntaxe EXEC(string) ;
  • un lot d'instructions Transact-SQL.

Différences entre le niveau 60 ou 65 et le niveau 70, 80 ou 90

Lorsque vous affectez la valeur 60 ou 65 au niveau de compatibilité, de nombreux comportements en sont affectés. Parmi ces comportements figurent ceux répertoriés dans la colonne de gauche du tableau ci-dessous.

ms178653.note(fr-fr,SQL.90).gifRemarque :
Pour plus d'informations sur les différences qui affectent les applications 6.x, consultez « Différences entre les niveaux de compatibilité inférieurs et le niveau 90 » plus loin dans cette rubrique, ainsi que les mots clés réservés des versions ultérieures à 6.x dans la section Remarques.

Paramètre de niveau de compatibilité égal à 60 ou 65

Paramètre de niveau de compatibilité égal à 70 ou plus

Les jeux de résultats des instructions SELECT avec une clause GROUP BY mais sans clause ORDER BY sont triés en fonction des colonnes GROUP BY.

Une clause GROUP BY n'effectue aucun tri à elle seule. Une clause ORDER BY doit être explicitement spécifiée pour que SQL Server trie tous les jeux de résultats. Pour plus d'informations, consultez SELECT (Transact-SQL).

Les colonnes dont le nom commence par des alias de table sont acceptées dans la clause SET d'une instruction UPDATE.

Les alias de table ne sont pas acceptés dans la clause SET d'une instruction UPDATE. La table ou la vue spécifiée dans la clause SET doit correspondre à celle qui est indiquée immédiatement après le mot clé UPDATE. Pour plus d'informations, consultez UPDATE (Transact-SQL).

Les colonnes de type bit créées sans option NULL ou NOT NULL explicite dans CREATE TABLE ou ALTER TABLE sont générées comme NOT NULL.

La possibilité de valeur NULL des colonnes de type bit sans possibilité de valeur NULL explicite est déterminée soit par le paramètre de session de SET ANSI_NULL_DFLT_ON ou SET ANSI_NULL_DFLT_OFF, soit par le paramètre de base de données de SET ANSI NULL DEFAULT. Pour plus d'informations, consultez SET (Transact-SQL).

La clause ALTER COLUMN ne peut pas être incluse dans ALTER TABLE.

La clause ALTER COLUMN peut être incluse dans ALTER TABLE. Pour plus d'informations, consultez ALTER TABLE (Transact-SQL).

Un déclencheur créé pour une table remplace tout déclencheur existant de même type (INSERT, UPDATE, DELETE). L'option WITH APPEND de CREATE TRIGGER peut être employée pour créer plusieurs déclencheurs de même type.

Des déclencheurs de même type sont ajoutés. Les noms de déclencheurs doivent être uniques. L'option WITH APPEND est implicite. Pour plus d'informations, consultez CREATE TRIGGER (Transact-SQL).

Si un lot ou une procédure contient des noms d'objets non valides, un avertissement est retourné lors de l'analyse ou de la compilation du lot et un message d'erreur s'affiche lors de son exécution.

Pour un objet non valide local, aucun avertissement n'est retourné lors de l'analyse ou de la compilation du lot et un message d'erreur s'affiche lors de son exécution.

Pour un objet non valide distant, la résolution différée des noms n'est toutefois pas prise en charge. Si une table distante non valide est utilisée dans une procédure, la création de la procédure échoue et retourne une erreur.

ms178653.note(fr-fr,SQL.90).gifRemarque :

La prise en charge de la résolution différée des noms (à savoir la possibilité, lors de la compilation, de référencer des objets qui n'existent pas jusqu'à l'exécution) est applicable uniquement aux noms de table ou de vue. Pour plus d'informations sur la résolution différée des noms, consultez CREATE PROCEDURE (Transact-SQL).

Les requêtes au format suivant sont exécutées correctement en ignorant la table Y et en insérant les résultats de l'instruction SELECT dans la table X.

INSERT X
SELECT select_list INTO Y

Microsoft SQL Server 7.0 ou version ultérieure retourne une erreur de syntaxe lors de l'exécution de cette même requête.

Le littéral de chaîne vide (' ') est interprété comme un espace simple.

Le littéral de chaîne vide (' ') est interprété comme une chaîne vide.

DATALENGTH('') retourne 1 ('' analysé comme un espace simple).

DATALENGTH(N'') retourne 2 (N'' analysé comme un espace Unicode simple).

DATALENGTH('') retourne 0.

DATALENGTH(N'') retourne 0.

LEFT('123', 0) retourne NULL.

LEFT(N'123', 0) retourne NULL.

LEFT('123', 0) retourne une chaîne vide.

LEFT(N'123', 0) retourne une chaîne vide.

LTRIM('     ') retourne NULL.

LTRIM(N'     ') retourne NULL.

LTRIM('     ') retourne une chaîne vide.

LTRIM(N'     ') retourne une chaîne vide.

REPLICATE('123', 0) retourne NULL.

REPLICATE(N'123', 0) retourne NULL.

REPLICATE('123', 0) retourne une chaîne vide.

REPLICATE(N'123', 0) retourne une chaîne vide.

RIGHT(N'123', 0) retourne NULL. RIGHT('123', 0) retourne NULL.

RIGHT('123', integer_expression) retourne NULL si integer_expression est négatif.

RIGHT(N'123', integer_expression) retourne NULL si integer_expression est négatif.

RIGHT('123', 0) retourne une chaîne vide.

RIGHT(N'123', 0) retourne une chaîne vide.

RIGHT('123', integer_expression) retourne une erreur si integer_expression est négatif. RIGHT(N'123', integer_expression) retourne une erreur si integer_expression est négatif.

RTRIM('     ') retourne NULL.

RTRIM(N'     ') retourne NULL.

RTRIM('     ') retourne une chaîne vide.

RTRIM(N'     ') retourne une chaîne vide.

SPACE(0) retourne NULL.

SPACE(0) retourne une chaîne vide.

La fonction SUBSTRING(expression, start, length) retourne NULL si une valeur supérieure au nombre de caractères dans expression est spécifiée pour start, ou que la valeur de length est égale à zéro. Par exemple, SUBSTRING(N'123', 4, 1) retourne NULL.

Dans des conditions identiques, SUBSTRING(expression, start, length) retourne une chaîne vide qui est délimitée par une paire de guillemets simples. Par exemple, SUBSTRING(N'123', 4, 1) retourne ''.

UPDATETEXT table.textcolumn textpointer 0 NULL NULL génère une valeur NULL.

UPDATETEXT table.textcolumn textpointer 0 NULL NULL génère un texte vide.

Les fonctions CHARINDEX et PATINDEX retournent NULL uniquement si le modèle et l'expression sont NULL.

Les fonctions CHARINDEX et PATINDEX retournent NULL lorsque l'un des paramètres d'entrée est NULL.

Les références à des colonnes text ou image dans les tables insérées et supprimées apparaissent comme des valeurs NULL.

Les références à des colonnes text ou image dans les tables insérées et supprimées ne sont pas autorisées.

L'extraction de colonnes text ou image à partir des tables insérées ou supprimées à l'intérieur d'un déclencheur retourne des valeurs NULL pour les colonnes text ou image.

L'extraction de colonnes text ou image à partir des tables insérées ou supprimées à l'intérieur d'un déclencheur n'est pas autorisée et génère une erreur.

Autorise UPDATETEXT à initialiser les colonnes text à NULL.

UPDATETEXT initialise les colonnes text à une chaîne vide.

WRITETEXT initialise les colonnes text à NULL.

Le paramètre concatenation of null yields null de sp_dboption a la valeur off (il est désactivé), ce qui retourne une chaîne vide si un opérande d'une opération de concaténation a la valeur NULL.

Le paramètre concatenation of null yields null de sp_dboption a la valeur on (il est activé), ce qui retourne NULL si un opérande d'une opération de concaténation a la valeur NULL.

Dans une instruction INSERT, une instruction SELECT qui retourne une valeur scalaire est autorisée dans la clause VALUES.

L'instruction INSERT ne peut pas comporter d'instruction SELECT dans la clause VALUES en tant que valeur à insérer.

Une instruction ROLLBACK dans une procédure stockée référencée dans une instruction INSERT table EXEC procedure entraîne la restauration de l'instruction INSERT, mais l'exécution du lot se poursuit.

Une instruction ROLLBACK dans une procédure stockée référencée dans une instruction INSERT...EXEC entraîne la restauration de la transaction tout entière et l'exécution du lot d'instructions s'arrête.

Différences entre les niveaux de compatibilité inférieurs et le niveau 90

Cette sous-section décrit de nouveaux comportements introduits par le niveau de compatibilité 90. Pour plus d'informations sur les différences de comportement qui affectent le niveau de compatibilité 80 et les niveaux de compatibilité inférieurs, consultez la section « Mots clés réservés » plus loin dans cette section.

Avec le niveau de compatibilité 90, les changements de comportement suivants se produisent.

Paramètre de niveau de compatibilité égal ou inférieur à 80

Paramètre de niveau de compatibilité égal à 90

Possibilité d'impact

Pour les indicateurs de verrouillage dans la clause FROM, le mot clé WITH est toujours facultatif.

À quelques exceptions près, les indicateurs de table sont pris en charge dans la clause FROM uniquement lorsque les indicateurs sont spécifiés à l'aide du mot clé WITH. Pour plus d'informations, consultez FROM (Transact-SQL).

Élevée

Les opérateurs *= et =* pour la jointure externe sont pris en charge avec un message d'avertissement.

Ces opérateurs ne sont pas pris en charge ; le mot clé OUTER JOIN doit être utilisé.

Élevée

Lors de la liaison des références de colonnes de la liste ORDER BY avec les colonnes définies dans la liste SELECT, les ambiguïtés de colonnes sont ignorées et les préfixes de colonnes parfois ignorés. Cette situation risque de retourner le jeu de résultats dans un ordre inattendu.

Par exemple, une clause ORDER BY composée d'une colonne unique en deux parties (<table_alias>.<column>) qui est utilisée comme référence à une colonne dans une liste SELECT est acceptée, mais l'alias de table est ignoré. Considérez la requête suivante.

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

Lorsqu'elle est exécutée, le préfixe de colonne est ignoré dans ORDER BY. L'opération de tri ne se produit pas sur la colonne source spécifiée (x.c1) comme prévu, mais sur la colonne c1 dérivée définie dans la requête. Le plan d'exécution de cette requête indique que les valeurs de la colonne dérivée sont calculées, puis que les valeurs calculées sont triées.

Des erreurs sont signalées concernant les ambiguïtés de colonnes. Les préfixes de colonne spécifiés, le cas échéant, dans ORDER BY, ne sont pas ignorés lors de la liaison à la colonne définie dans la liste SELECT.

Considérez la requête suivante.

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

Lorsqu'elle est exécutée, le préfixe de colonne dans la clause ORDER BY est ignoré. L'opération de tri se produit sur la colonne source spécifiée (x.c1) comme prévu. Le plan d'exécution de cette requête indique que l'opérateur de tri classe les lignes retournées à partir de t_table, puis que les valeurs de la colonne dérivée c1 définie dans la liste SELECT sont calculées.

Moyenne

Dans une instruction INSERT SELECT à partir d'une UNION de différents types de données, chaque branche UNION est directement convertie selon le type de colonne cible de l'instruction INSERT. Même si l'union utilisée par elle-même risque d'échouer en raison de conversions de types incompatibles, l'instruction INSERT SELECT permet à l'UNION de réussir car la branche vers le type de résultat de l'UNION n'est jamais convertie.

Dans SQL Server 2005, le type de résultat d'UNION dérive indépendamment d'INSERT SELECT. Chaque branche d'UNION est convertie selon le type de résultat d'UNION, puis convertie d'après le type de la colonne cible d'INSERT. S'il existe des types incompatibles dans l'UNION, la première conversion risque de générer une erreur. Pour une exécution au niveau de compatibilité 90, vous devez résoudre toutes les unions de type incompatible utilisées dans INSERT SELECT.

Moyenne

Les opérations d'insertion et de mise à jour via une vue ne sont pas correctement prises en charge pour les vues qui spécifient la clause WITH CHECK OPTION lorsque la vue ou une vue référencée utilise la clause TOP.

Les opérations d'insertion et de mise à jour via une vue ne sont pas prises en charge pour les vues qui utilisent WITH CHECK OPTION lorsque la vue ou une vue référencée utilise la clause TOP.

Moyenne

L'UNION d'une colonne de longueur variable avec une colonne de longueur fixe produit une colonne de longueur fixe.

L'UNION d'une colonne de longueur variable avec une colonne de longueur fixe produit une colonne de longueur variable.

Moyenne

SET XACT_ABORT OFF est autorisé au sein d'un déclencheur.

SET XACT_ABORT OFF n'est pas autorisé au sein d'un déclencheur.

Moyenne

La clause FOR BROWSE est autorisée (et ignorée) dans les vues.

La clause FOR BROWSE n'est pas autorisée dans les vues.

Moyenne

Les erreurs de domaine ne sont pas contrôlées par ANSI_WARNINGS. Les paramètres ARITHABORT sont respectés, si ANSI_WARNINGS a la valeur OFF et que ARITHABORT ne fait l'objet d'aucune modification.

Les erreurs de domaine sont aussi contrôlées par ANSI_WARNINGS et constituent des erreurs de gravité 16. Si ANSI_WARNINGS ou ARITHABORT ont la valeur ON, une erreur est générée au lieu de retourner une valeur NULL. Cette modification risque de rompre les scripts utilisateur qui dépendent d'ARITHABORT avec la valeur OFF.

Moyenne

Si une requête de relais et une source de données distante [OpenRowset ou OpenQuery] produisent des colonnes avec des doublons de nom, les noms de colonne dupliqués sont ignorés, sauf si les colonnes sont explicitement nommées dans la requête.

Si une requête de relais et une source de données distante [OpenRowset ou OpenQuery] produisent une colonne avec des doublons de nom de colonne, une erreur est générée.

Faible

Les constantes de chaîne de caractères et les constantes varbinary d'une taille supérieure à 8000 sont traitées en tant que type text, ntext ou image.

Les constantes de chaîne de caractères et les constantes varbinary d'une taille supérieure à 8000 sont traitées en tant que type varchar(max) (ou nvarchar(max) et varbinary(max), respectivement). Cela peut modifier le type de données de la table créée à l'aide de SELECT … INTO si la liste SELECT contient de telles expressions.

Faible

Les comparaisons entre types numériques (smallint, tinyint, int, bigint, numeric, decimal, smallmoney, money) s'effectuent en convertissant les éléments de comparaison avec une précédence inférieure dans la hiérarchie de type par rapport au type dont la précédence est plus élevée.

Les valeurs de type numérique sont comparées sans conversion. Les performances s'en trouvent optimisées. Cela risque toutefois d'entraîner certaines modifications dans le comportement, notamment dans les cas où la conversion aurait entraîné des exceptions de dépassement.

Faible

Les fonctions de métadonnées intégrées qui prennent des arguments de chaîne tronquent leur entrée si celle-ci dépasse 4000 caractères.

Des fonctions de métadonnées intégrées génèrent une erreur si la troncation entraîne une perte de caractères sans espace.

Faible

Le jeu de caractères interdits dans un identificateur sans guillemet demeure inchangé.

L'analyseur Transact-SQL prend en charge la norme Unicode 3.2, qui modifie la classification des caractères pour certains caractères internationaux qui sont interdits dans des identificateurs non délimités.

Faible

SET ANSI_WARNINGS ON ne remplace pas le paramètre de SET ARITHABORT OFF en cas d'erreurs de domaine à virgule flottante [à savoir des arguments négatifs pour la fonction log()]. Si ANSI_WARNINGS a la valeur ON mais que ARITHABORT a la valeur OFF, les erreurs de domaine à virgule flottante n'entraînent pas l'achèvement de la requête.

SET ANSI_WARNINGS ON remplace entièrement le paramètre ARITHABORT OFF. Les erreurs de domaine à virgule flottante dans ce cas entraînent l'achèvement de la requête.

Faible

Les constantes de type non entier sont autorisées (et ignorées) dans la clause ORDER BY.

Les constantes de type non entier ne sont pas autorisées dans la clause ORDER BY.

Faible

L'instruction SET vide (sans affectation de l'option SET) est autorisée.

La clause SET vide n'est pas autorisée.

Faible

L'attribut IDENTITY ne dérive pas correctement des colonnes produites par une table dérivée.

L'attribut IDENTITY dérive correctement des colonnes produites par des tables dérivées.

Faible

La propriété de possibilité de valeur NULL d'opérateurs arithmétiques pour le type de données à virgule flottante accepte toujours les valeurs NULL.

La propriété de possibilité de valeur NULL d'opérateurs arithmétiques pour le type de données à virgule flottante est modifiée de manière à ne pas accepter de valeurs NULL dans le cas où les entrées ne pourraient pas accepter de valeurs NULL et où ANSI_WARNINGS aurait la valeur ON.

Faible

Dans l'instruction INSERT SELECT avec UNION, les types produits par les jeux de résultats individuels sont tous convertis selon le type de résultat de destination.

Dans l'instruction INSERT SELECT avec UNION, le type dominant des différentes branches est déterminé et les résultats convertis selon ce type avant d'être convertis d'après le type de la table de destination.

Faible

Dans l'instruction SELECT FOR XML, hex(27) (le caractère ') et hex(22) (le caractère ") sont toujours décomposés en entités, y compris lorsque cela ne s'avère pas nécessaire.

FOR XML décompose hex(27) et hex(22) en entités uniquement lorsque cela s'avère nécessaire. Ils ne sont pas décomposés en entités dans les situations suivantes :

  • Dans le contenu d'attribut, hex(27) (le caractère ') n'est pas décomposé en entités si les valeurs d'attribut sont délimitées par ", tandis que hex(22) (le caractère ") n'est pas décomposé en entités si les valeurs d'attribut sont délimitées par '.
  • Dans le contenu d'élément, hex(27) et hex(22) ne sont jamais décomposés en entités.

Faible

Dans FOR XML, la valeur de l'horodateur est mappée à un entier.

Dans FOR XML, la valeur de l'horodateur est mappée à une valeur binaire.

Pour plus d'informations, consultez Prise en charge de FOR XML pour le type de données timestamp.

Élevée (si une colonne timestamp est utilisée) ; sinon, faible

Dans FOR XML et OPENXML, les caractères Unicode à plage élevée (3 octets) dans les noms sont représentés à l'aide de 8 positions.

Avec l'utilisation, par exemple, de 8 positions, FOR XML représente le point de code Unicode U+10000 sous la forme :

<a_x00010000_ c1="1" />

Dans FOR XML et OPENXML, les caractères Unicode à plage élevée (3 octets) dans les noms sont représentés à l'aide de 6 positions.

Avec l'utilisation, par exemple, de 6 positions, FOR XML représente le point de code Unicode U+10000 sous la forme :

<a_x010000_ c1="1" />

Faible

Dans FOR XML, des mappages de table dérivée en mode AUTO sont traités de manière transparente.

Par exemple :

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;

Lorsque le niveau de compatibilité de AdventureWorks a la valeur 80, l'exemple ci-dessus produit :

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

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

Dans FOR XML, des mappages de table dérivée en mode AUTO sont traités de manière opaque.

Lorsque le niveau de compatibilité de AdventureWorks a la valeur 90, l'exemple précédent produit :

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

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

Pour plus d'informations sur les modifications en mode AUTO, consultez Améliorations du mode AUTO.

Élevée (si le mode FOR XML AUTO est appliqué à des vues) ; sinon, faible

La chaîne vers les conversions money prend en charge l'utilisation d'un caractère barre oblique inverse (\) en tant que symbole monétaire uniquement dans les langues japonaise et coréenne.

Le caractère barre oblique inverse (\) est accepté dans toutes les chaînes vers des conversions money, dans toutes les langues. ISNUMERIC retourne True lorsque \ est utilisé en tant que symbole monétaire.

Pour les bases de données des versions de SQL Server antérieures à SQL Server 2005, ce nouveau comportement altère les index et colonnes calculées dépendant d'une valeur de retour ISNUMERIC qui contient le caractère \ et dont la langue n'est ni le japonais ni le coréen.

Faible

Le résultat d'un opérateur arithmétique accepte toujours les valeurs NULL, même si les opérandes n'acceptent pas les valeurs NULL et que ANSI_WARNINGS ou ARITHABORT a la valeur ON.

Lorsque ANSI_WARNINGS ou ARITHABORT a la valeur ON, le résultat d'un opérateur arithmétique à virgule flottante n'accepte pas les valeurs NULL si les deux opérandes n'acceptent pas les valeurs NULL.

Cette modification de possibilité de valeur NULL risque de provoquer un échec lorsque bcp est utilisé pour exporter en bloc des données qui utilisent le format binaire à partir d'une table SQL Server 2000 avec une colonne calculée qui utilise un opérateur arithmétique à virgule flottante et que bcp ou BULK INSERT est ensuite utilisé pour importer en bloc ces données dans une table SQL Server 2005 avec la même définition.

ms178653.note(fr-fr,SQL.90).gifRemarque :

Lorsque les deux options ont la valeur OFF, le moteur de base de données indique le résultat comme acceptant les valeurs NULL. Ce comportement est identique dans SQL Server 2000.

Faible

Pour les fonctions intégrées qui prennent nvarchar comme paramètre, si la valeur fournie est de type varchar, cette valeur est convertie en type nvarchar(4000). Dans SQL Server 2000, si une valeur plus importante est transmise, elle est discrètement tronquée.

Pour les fonctions intégrées qui prennent nvarchar comme paramètre, si la valeur fournie est de type varchar, cette valeur est toujours convertie en type nvarchar(4000). Cependant, si une valeur plus importante est transmise, SQL Server 2005 génère une erreur.

Pour une exécution au niveau de compatibilité 90, vous devez résoudre tout code personnalisé qui dépend du comportement de la troncation.

Faible

L'union d'une chaîne de longueur fixe (char, binary ou nchar) avec une chaîne de longueur variable (varchar, varbinary ou nvarchar) retourne un résultat de longueur fixe.

L'union d'une chaîne de longueur variable avec une chaîne de longueur fixe retourne une chaîne de longueur variable.

Pour une exécution avec un niveau de compatibilité 90, vous devez résoudre toutes les insertions (index, requêtes et colonnes calculées) qui dépendent du type résultant d'une union entre un type de taille variable et un type de taille fixe.

Faible

Les noms d'objets contenant le caractère 0xFFFF constituent des identificateurs valides.

Les noms d'objets contenant les caractères 0xFFFF sont des identificateurs non valides et sont inaccessibles.

Pour une exécution avec le niveau de compatibilité 90, vous devez renommer les objets qui contiennent ce caractère.

Faible

Dans SELECT ISNUMERIC('<string>'), les virgules présentes dans <string> ont toute leur importance.

Par exemple, la requête SELECT ISNUMERIC('121212,12') suivante retourne 0, ce qui signifie que la chaîne 121212,12 n'est pas numérique.

Dans SELECT ISNUMERIC('<string>'), les virgules présentes dans <string> sont ignorées.

Par exemple, la requête SELECT ISNUMERIC('121212,12') suivante retourne 1, ce qui signifie que la chaîne 121212,12 est numérique.

Faible

Un signe deux-points (:) à la suite d'un mot clé réservé dans une instruction Transact-SQL est ignoré.

Un signe deux-points (:) à la suite d'un mot clé réservé dans une instruction Transact-SQL provoque l'échec de l'instruction.

Faible

Dans une sous-requête, une clause GROUP BY qui référence une colonne de la requête externe réussit.

Dans une sous-requête, une clause GROUP BY qui référence une colonne de la requête externe retourne une erreur conformément au standard SQL.

Faible

Mots clés réservés

Le paramètre de compatibilité détermine également les mots clés qui sont réservés par le moteur de base de données. Le tableau suivant illustre les mots clés réservés introduits par chacun des niveaux de compatibilité.

Paramètre de niveau de compatibilité Mots clés réservés

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

À un niveau de compatibilité spécifique, les mots clés réservés incluent l'ensemble des mots clés introduits à ce niveau ou en-dessous de celui-ci. Pour les applications au niveau 90, par exemple, l'ensemble des mots clés listés dans le tableau précédent sont réservés. À des niveaux de compatibilité inférieurs, les mots clés de niveau 90 demeurent des noms d'objets valides, mais les fonctions de langage de niveau 90 correspondant à ces mots clés sont indisponibles.

Une fois introduit, un mot clé demeure réservé. Le mot clé réservé BACKUP, par exemple, introduit au niveau de compatibilité 70, est également réservé aux niveaux 80 et 90.

Si une application utilise un identificateur réservé en tant que mot clé pour son niveau de compatibilité, l'application échoue. Pour y remédier, placez l'identificateur entre crochets ([]) ou entre guillemets ("") ; par exemple, pour effectuer la mise à niveau d'une application qui utilise l'identificateur EXTERNAL au niveau de compatibilité 90, vous pouvez modifier l'identificateur en [EXTERNAL] ou en "EXTERNAL".

Autorisations

Seuls le propriétaire de la base de données, les membres du rôle de serveur fixe sysadmin et le rôle de base de données fixe db_owner (si vous modifiez la base de données en cours) peuvent exécuter cette procédure.

Valeurs du code de retour

0 (réussite) ou 1 (échec)

Exemples

A. Modification du niveau de compatibilité par SQL Server 2000

L'exemple suivant modifie le niveau de compatibilité de la base de données AdventureWorks sur 80.

EXEC sp_dbcmptlevel AdventureWorks, 80;
GO

B. Effet du niveau de compatibilité sur ORDER BY (scénario 1)

L'exemple suivant illustre la différence dans la liaison ORDER BY pour les niveaux de compatibilité 80 et 90. Cet exemple crée un exemple de table, SampleTable, dans la base de données tempdb.

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

Dans le niveau de compatibilité 90 (niveau par défaut), l'instruction SELECT... ORDER BY suivante génère une erreur car le nom de la colonne dans la clause AS, c1, est ambigu.

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

Après la redéfinition de la base de données avec le niveau de compatibilité 80, la même instruction SELECT... ORDER BY réussit.

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

L'instruction SELECT... ORDER BY suivante fonctionne avec les deux niveaux de compatibilité.

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. Effet du niveau de compatibilité sur ORDER BY (scénario 2)

Dans le niveau de compatibilité 90, celui par défaut, l'instruction SELECT...ORDER BY suivante génère une erreur car il existe un préfixe de table supplémentaire dans la clause ORDER BY.

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

Après la redéfinition de la base de données avec le niveau de compatibilité 80, la même instruction SELECT...ORDER BY réussit.

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

L'instruction SELECT...ORDER BY suivante fonctionne avec les deux niveaux de compatibilité.

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

Voir aussi

Référence

Procédures stockées du moteur de base de données (Transact-SQL)
ALTER DATABASE (Transact-SQL)
ALTER TABLE (Transact-SQL)
CREATE PROCEDURE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
EXECUTE (Transact-SQL)
Mots clés réservés (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)
Procédures stockées système (Transact-SQL)
UPDATE (Transact-SQL)

Autres ressources

Option de niveau de compatibilité de la base de données
Nouvelles fonctionnalités de FOR XML
Définition des options de base de données
Utilisation d'options dans SQL Server

Aide et Informations

Assistance sur SQL Server 2005

Historique des modifications

Version Historique

17 juillet 2006

Contenu mis à jour :
  • Suppression de la phrase « Le niveau de compatibilité de la base de données master ne peut pas être modifié ».

14 avril 2006

Nouveau contenu :
  • Ajout de la section « Meilleures pratiques ».
  • Ajout de texte sur le comportement de GROUP BY dans une sous-requête.