Niveau de compatibilité ALTER DATABASE (Transact-SQL)

Définit certains comportements de base de données pour qu'ils soient compatibles avec la version de SQL Server spécifiée. Pour obtenir des informations sur d'autres options ALTER DATABASE, consultez ALTER DATABASE (Transact-SQL).

Icône Lien de rubrique Conventions de la syntaxe Transact-SQL

Syntaxe

ALTER DATABASE database_name 
SET COMPATIBILITY_LEVEL = { 90 | 100 | 110 }

Arguments

  • database_name
    Nom de la base de données à modifier.

  • COMPATIBILITY_LEVEL { 90 | 100 | 110 }
    Version de SQL Server avec laquelle la base de données doit être compatible. La valeur doit être l'une des suivantes :

    90 = SQL Server 2005

    100 = SQL Server 2008 et SQL Server 2008 R2

    110 = SQL Server 2012

Notes

Pour toutes les installations de SQL Server 2012, le niveau de compatibilité par défaut est 110. Il s'agit du niveau défini pour les bases de données créées dans SQL Server 2012, à moins que le niveau de compatibilité de la base de données model soit inférieur. Lorsqu'une base de données est mise à niveau vers SQL Server 2012 à partir d'une version antérieure quelconque de SQL Server, la base de données conserve son niveau de compatibilité existant, s'il est au moins de 90. Mettre à niveau une base de données avec un niveau de compatibilité inférieur à 90 affecte à la base de données le niveau de compatibilité 90. Cela s'applique aussi bien aux bases de données système qu'aux bases de données utilisateur. Utilisez ALTER DATABASE pour modifier le niveau de compatibilité de la base de données. Pour afficher le niveau de compatibilité actuel d'une base de données, exécutez une requête sur la colonne compatibility_level de l'affichage catalogue sys.databases.

Utilisation du niveau de compatibilité pour la compatibilité descendante

Le niveau de compatibilité affecte uniquement les comportements de la base de données spécifiée et non ceux du serveur tout entier. Le niveau de compatibilité fournit uniquement une compatibilité descendante partielle avec les versions antérieures de SQL Server. Utilisez le niveau de compatibilité en tant qu'aide à la migration intérimaire pour contourner les problèmes liés aux différences de version dans les comportements qui sont contrôlés par le paramètre de niveau de compatibilité correspondant. Si des applications SQL Server existantes sont affectées par des différences de comportement dans SQL Server 2012, convertissez l'application afin qu'elle fonctionne correctement. Utilisez ensuite ALTER DATABASE pour changer le niveau de compatibilité en spécifiant 100. Le nouveau paramètre de compatibilité d'une base de données devient effectif lorsque la base de données devient ensuite active (soit comme base de données par défaut lors de la connexion, soit lorsqu'elle est spécifiée dans une instruction USE).

Meilleures pratiques

La modification du niveau de compatibilité alors que des utilisateurs sont connectés à la base de données peut générer des jeux de résultats incorrects pour les requêtes actives. Par exemple, si le niveau de compatibilité change alors qu'un plan de requête est en cours de compilation, le plan compilé peut être basé à la fois sur l'ancien niveau de compatibilité et sur le nouveau, ce qui aboutit à un plan incorrect et à des résultats éventuellement erronés. En outre, le problème peut être aggravé si le plan est placé dans la mémoire cache du plan et réutilisé pour des requêtes ultérieures. Pour éviter que les requêtes ne donnent des résultats inexacts, nous vous recommandons d'utiliser la procédure suivante pour modifier le niveau de compatibilité d'une base de données :

  1. Placez la base de données en mode d'accès mono-utilisateur en utilisant ALTER DATABASE SET SINGLE_USER.

  2. Modifiez le niveau de compatibilité de la base de données.

  3. Placez la base de données en mode d'accès multi-utilisateur en utilisant 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).

Niveaux de compatibilité et procédures stockées

Lors de l'exécution d'une procédure stockée, elle utilise le niveau de compatibilité en cours 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.

Différences entre le niveau de compatibilité 90 et le niveau 100

Cette section décrit les nouveaux comportements introduits avec le niveau de compatibilité 100.

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

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

Possibilité d'impact

Le paramètre QUOTED_IDENTIFER est toujours défini sur ON pour les fonctions de table à instructions multiples lorsqu'elles sont créées indépendamment du paramètre de niveau de session.

Le paramètre de session QUOTED IDENTIFIER est respecté lorsque les fonctions de table à instructions multiples sont créées.

Moyenne

Lorsque vous créez ou altérez une fonction de partition, les littéraux datetime et smalldatetime dans la fonction sont évalués en supposant que US_English (Anglais États-Unis) est le paramètre de langue.

Le paramètre de langue actuel est utilisé pour évaluer les littéraux datetime et smalldatetime dans la fonction de partition.

Moyenne

La clause FOR BROWSE est autorisée (et ignorée) dans les instructions INSERT et SELECT INTO.

La clause FOR BROWSE n'est pas autorisée dans les instructions INSERT et SELECT INTO.

Moyenne

Les prédicats de texte intégral sont autorisés dans la clause OUTPUT.

Les prédicats de texte intégral ne sont pas autorisés dans la clause OUTPUT.

Faible

Les instructions CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST et DROP FULLTEXT STOPLIST ne sont pas prises en charge. La liste de mots vides système est associée automatiquement aux nouveaux index de recherche en texte intégral.

Les instructions CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST et DROP FULLTEXT STOPLIST sont prises en charge.

Faible

MERGE n'est pas appliqué comme mot clé réservé.

MERGE est un mot clé entièrement réservé. L'instruction MERGE est prise en charge sous les niveaux de compatibilité 100 et 90.

Faible

L'utilisation de l'argument <dml_table_source> de l'instruction INSERT déclenche une erreur de syntaxe.

Vous pouvez capturer les résultats d'une clause OUTPUT dans une instruction imbriquée INSERT, UPDATE, DELETE ou MERGE, puis les insérer dans une table ou une vue cible. Cette opération s'effectue en utilisant l'argument <dml_table_source> de l'instruction INSERT.

Faible

Sauf si l'option NOINDEX est spécifiée, DBCC CHECKDB ou DBCC CHECKTABLE effectue les vérifications de la cohérence physique et logique sur une seule table ou vue indexée et sur tous ses index non-cluster et XML. Les index spatiaux ne sont pas pris en charge.

DBCC CHECKDB ou DBCC CHECKTABLE effectue les vérifications de cohérence physique et logique sur une seule table et sur tous ses index non-cluster, sauf si l'option NOINDEX est spécifiée. Toutefois, seules des vérifications de cohérence physique sont effectuées par défaut sur les index XML, les index spatiaux et les vues indexées.

Si WITH EXTENDED_LOGICAL_CHECKS est spécifié, des vérifications logiques sont effectuées sur des vues indexées, des index XML et des index spatiaux, là où ils sont présents. Par défaut, les vérifications de cohérence physique sont effectuées avant les vérifications de cohérence logique. Si l'option NOINDEX est également spécifiée, seules les vérifications logiques sont effectuées.

Faible

Lorsqu'une clause OUTPUT est utilisée avec une instruction des langages de manipulation de données (DML) et une erreur d'exécution se produit pendant l'exécution d'instruction, la transaction complète est terminée et restaurée.

Lorsqu'une clause OUTPUT est utilisée avec une instruction DML (Data Manipulation Language) et qu'une erreur d'exécution se produit pendant l'exécution de l'instruction, le comportement est déterminé par le paramètre SET XACT_ABORT. Si SET XACT_ABORT a la valeur OFF, une erreur de l'abandon de l'instruction générée par l'instruction DML à l'aide de la clause OUTPUT met fin à l'instruction, mais l'exécution du lot continue et la transaction n'est pas restaurée. Si SET XACT_ABORT a la valeur ON, toutes les erreurs d'exécution générées par l'instruction DML à l'aide de la clause OUTPUT termineront le lot, et la transaction est restaurée.

Faible

CUBE et ROLLUP ne sont pas appliqués comme mots clé réservés.

CUBE et ROLLUP sont des mots clé réservés dans la clause GROUP BY.

Faible

La validation stricte est appliquée aux éléments du type anyType XML.

La validation libre est appliquée aux éléments du type anyType XML. Pour plus d'informations, consultez Composants génériques et validation de contenu.

Faible

Les attributs spéciaux xsi:nil et xsi:type ne peuvent pas être interrogés ou modifiés par les instructions des langages de manipulation de données.

Cela signifie que /e/@xsi:nil échoue alors que /e/@* ignore les attributs xsi:nil et xsi:type. Toutefois, /e retourne les attributs xsi:nil et xsi:type pour des raisons de cohérence avec SELECT xmlCol, même si xsi:nil = "false".

Les attributs spéciaux xsi:nil et xsi:type sont stockés comme attributs réguliers et peuvent être interrogés et modifiés.

Par exemple, l'exécution de la requête SELECT x.query('a/b/@*') retourne tous les attributs y compris xsi:nil et xsi:type. Pour exclure ces types dans la requête, remplacez @* par @*[namespace-uri(.) != "insert xsi namespace uri" et non (local-name(.) = "type" ou local-name(.) ="nil".

Low

Une fonction définie par l'utilisateur qui convertit une valeur de chaîne constante XML en un type datetime SQL Server est marquée comme déterministe.

Une fonction définie par l'utilisateur qui convertit une valeur de chaîne constante XML en un type datetime SQL Server est marquée comme non déterministe.

Faible

Les types de liste et d'union XML ne sont pas pris en charge complètement.

Les types de liste et d'union sont complètement pris en charge ainsi que les fonctionnalités suivantes :

  • Union de liste

  • Union d'union

  • Liste de types atomiques

  • Liste d'union

Faible

Les options SET requises pour une méthode xQuery ne sont pas validées lorsque la méthode est contenue dans une vue ou une fonction table incluse.

Les options SET requises pour une méthode xQuery sont validées lorsque la méthode est contenue dans une vue ou une fonction table incluse. Une erreur survient si les options SET de la méthode sont définies incorrectement.

Faible

Les valeurs d'attribut XML qui contiennent des caractères de fin de ligne (retour chariot et saut de ligne) ne sont pas normalisées selon la norme XML. Autrement dit, les deux caractères sont retournés à la place d'un caractère de saut de ligne unique.

Les valeurs d'attribut XML qui contiennent des caractères de fin de ligne (retour chariot et saut de ligne) sont normalisées selon la norme XML. Autrement dit, tous les sauts de ligne dans les entités analysées externes (y compris l'entité de document) sont normalisés à l'entrée en un caractère unique #xA par la traduction de la séquence de deux caractères #xD #xA et #xD qui n'est pas suivi de #xA.

Les applications qui utilisent des attributs pour transporter des valeurs de chaîne qui contiennent des caractères de fin de ligne ne recevront pas ces caractères en retour lorsqu'ils sont soumis. Pour éviter le processus de normalisation, utilisez les entités de caractère numérique XML pour encoder tous les caractères de fin de ligne.

Faible

Les propriétés de colonne ROWGUIDCOL et IDENTITY peuvent être nommées de manière incorrecte en tant que contrainte. Par exemple, l'instruction CREATE TABLE T (C1 int CONSTRAINT MyConstraint IDENTITY) s'exécute, mais le nom de contrainte n'est pas conservé et n'est pas accessible à l'utilisateur.

Les propriétés de colonne ROWGUIDCOL et IDENTITY ne peuvent pas être nommées en tant que contrainte. L'erreur 156 est retournée.

Faible

La mise à jour des colonnes en utilisant une affectation bidirectionnelle telle que UPDATE T1 SET @v = column_name = <expression> peut produire des résultats inattendus parce que la valeur vivante de la variable peut être utilisée dans d'autres clauses telles que la clause WHERE et ON pendant l'exécution d'instruction à la place de la valeur de départ de l'instruction. Cette opération peut modifier les significations des prédicats de façon imprévisible et ligne par ligne.

Ce comportement est applicable uniquement lorsque le niveau de compatibilité est défini à 90.

La mise à jour de colonnes en utilisant une affectation bidirectionnelle produit des résultats attendus car seule la valeur de départ d'instruction de la colonne fait l'objet d'un accès pendant l'exécution de l'instruction.

Faible

L'attribution de variable est autorisée dans une instruction contenant un opérateur UNION de niveau supérieur, celle-ci produit néanmoins des résultats inattendus. Par exemple, dans les instructions suivantes, la variable locale @v reçoit la valeur de la colonne BusinessEntityID issue de l'union de deux tables. Par définition, lorsque l'instruction SELECT retourne plusieurs valeurs, la dernière valeur retournée est affectée à la variable. Dans ce cas, la dernière valeur est attribuée correctement à la variable, toutefois, le jeu de résultats de l'instruction SELECT UNION est également retourné.

ALTER DATABASE AdventureWorks2012
SET compatibility_level = 90;
GO
USE AdventureWorks2012;
GO
DECLARE @v int;
SELECT @v = BusinessEntityID FROM HumanResources.Employee
UNION ALL
SELECT @v = BusinessEntityID FROM HumanResources.EmployeeAddress;
SELECT @v;

L'attribution de variable n'est pas autorisée dans une instruction contenant un opérateur UNION de niveau supérieur. L'erreur 10734 est retournée.

Pour résoudre l'erreur, réécrivez la requête, comme dans l'exemple suivant.

DECLARE @v int;
SELECT @v = BusinessEntityID FROM 
    (SELECT BusinessEntityID FROM HumanResources.Employee
     UNION ALL
     SELECT BusinessEntityID FROM HumanResources.EmployeeAddress) AS Test;
SELECT @v;

Faible

La fonction ODBC {fn CONVERT()} utilise le format de date par défaut de la langue. Pour certaines langues, le format par défaut est YDM, ce qui peut provoquer des erreurs de conversion lorsque CONVERT() est associé à d'autres fonctions, telles que {fn CURDATE ()}, qui attendent un format YMD.

La fonction ODBC {fn CONVERT()} utilise le style 121 (format YMD indépendant de la langue) lors de la conversion aux types de données ODBC SQL_TIMESTAMP, SQL_DATE, SQL_TIME, SQLDATE, SQL_TYPE_TIME et SQL_TYPE_TIMESTAMP.

Faible

La fonction ODBC {fn CURDATE()} retourne uniquement la date au format 'YYYY-MM-DD'.

La fonction ODBC {fn CURDATE ()} retourne la date et l'heure à la fois, par exemple 'YYYY-MM-DD hh:mm:ss.

Faible

Les intrinsèques datetime tels que DATEPART ne requièrent pas que les valeurs d'entrée de chaîne soient des littéraux datetime valides. Par exemple, SELECT DATEPART (année, '2007/05-30') compile correctement.

Les intrinsèques datetime tels que DATEPART requièrent que les valeurs d'entrée de chaîne soient des littéraux datetime valides. L'erreur 241 est retournée lorsqu'un littéral datetime non valide est utilisé.

Low

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

Cette section décrit les nouveaux comportements introduits avec le niveau de compatibilité 110.

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

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

Les objets de base de données CLR (Common Language Runtime) sont exécutés avec la version 4 du CLR. Toutefois, quelques changements de comportement introduits dans la version 4 du CLR sont évités. Pour plus d'informations, consultez Nouveautés dans l'intégration du CLR.

Les objets de base de données CLR sont exécutés avec la version 4 du CLR.

Le XQuery active string-length et substring compte chaque caractère de substitution comme deux caractères.

Le XQuery active string-length et substring compte chaque caractère de substitution comme un seul caractère.

PIVOT est autorisé dans une requête d'expression de table commune récursive. Cependant, la requête retourne des résultats incorrects lorsqu'il existe plusieurs lignes par regroupement.

PIVOT n'est pas autorisé dans une requête d'expression de table commune récursive. Une erreur est retournée.

L'algorithme RC4 est uniquement pris en charge pour des raisons de compatibilité descendante. Le nouveau matériel ne peut être chiffré à l'aide de RC4 ou de RC4_128 que lorsque la base de données se trouve dans le niveau de compatibilité 90 ou 100. (Non recommandé.) Dans SQL Server 2012, le matériel chiffré à l'aide de RC4 ou de RC4_128 peut être déchiffré dans n'importe quel niveau de compatibilité.

Le nouveau matériel ne peut pas être chiffré à l'aide de RC4 ou RC4_128. Utilisez à la place un algorithme plus récent, tel qu'un des algorithmes AES. Dans SQL Server 2012, le matériel chiffré à l'aide de RC4 ou de RC4_128 peut être déchiffré dans n'importe quel niveau de compatibilité.

Le style par défaut pour les opérations CAST et CONVERT sur les types de données time et datetime2 est 121, sauf lorsque l'un des types est utilisé dans une expression de colonne calculée. Pour les colonnes calculées, le style par défaut est 0. Ce comportement influe sur les colonnes calculées lorsqu'elles sont créées, utilisées dans des requêtes impliquant le paramétrage automatique, ou utilisées dans des définitions de contraintes.

L'exemple suivant illustre la différence entre les styles 0 et 121. Il ne présente pas le comportement décrit ci-dessus. Pour plus d'informations sur les styles de date et d'heure, consultez CAST et CONVERT (Transact-SQL).

CREATE TABLE t1 (c1 time(7), c2 datetime2); 
INSERT t1 (c1,c2) VALUES (GETDATE(), GETDATE());
SELECT CONVERT(nvarchar(16),c1,0) AS TimeStyle0
       ,CONVERT(nvarchar(16),c1,121)AS TimeStyle121
       ,CONVERT(nvarchar(32),c2,0) AS Datetime2Style0
       ,CONVERT(nvarchar(32),c2,121)AS Datetime2Style121
FROM t1;
-- Returns values such as the following.
TimeStyle0       TimeStyle121     Datetime2Style0      Datetime2Style121
---------------- ---------------- -------------------- --------------------------
3:15PM           15:15:35.8100000 Jun  7 2011  3:15PM  2011-06-07 15:15:35.8130000

Lorsque le niveau de compatibilité est 110, le style par défaut pour les opérations CAST et CONVERT sur les types de données time et datetime2 est toujours 121. Si votre requête repose sur l'ancien comportement, utilisez un niveau de compatibilité inférieur à 110, ou spécifiez explicitement le style 0 dans la requête affectée.

La mise à niveau de la base de données vers le niveau de compatibilité 110 ne modifie pas les données utilisateur stockées sur le disque. Vous devez corriger manuellement ces données comme il convient. Par exemple, si vous avez utilisé SELECT INTO pour créer une table à partir d'une source qui contenait une expression de colonne calculée décrite ci-dessus, les données (utilisant le style 0) sont stockées à la place de la définition de colonne calculée. Vous devez mettre à jour manuellement ces données pour qu'elles correspondent au style 121.

Toutes les colonnes des tables distantes du type smalldatetime qui sont référencées dans une vue partitionnée sont mappées en datetime. Les colonnes correspondantes dans les tables locales (dans la même position ordinale de la liste de sélection) doivent être de type datetime.

Toutes les colonnes des tables distantes du type smalldatetime qui sont référencées dans une vue partitionnée sont mappées en smalldatetime. Les colonnes correspondantes dans les tables locales (dans la même position ordinale de la liste de sélection) doivent être de type smalldatetime.

Après la mise à niveau en 110, la vue partitionnée distribuée échoue en raison d'une incompatibilité de type de données. Vous pouvez résoudre ce problème en modifiant le type de données dans la table distante en datetime ou en définissant le niveau de compatibilité de la base de données locale à 100 ou moins.

La fonction SOUNDEX implémente les règles suivantes.

  1. Si character_expression possède des lettres doubles, elles sont traitées comme une seule lettre.

  2. Si une voyelle (A, E, I, O, U) sépare deux consonnes qui ont le même code soundex, la consonne à droite de la voyelle est codée.

La fonction SOUNDEX implémente les règles suivantes.

  1. Si character_expression possède des lettres doubles, elles sont traitées comme une seule lettre.

  2. Si character_expression possède plusieurs lettres côte à côte qui ont le même numéro dans le guide de codage soundex, celles-ci sont traités comme une seule lettre.

  3. Si une voyelle (A, E, I, O, U) sépare deux consonnes qui ont le même code soundex, la consonne à droite de la voyelle est codée.

  4. Si H ou W séparent deux consonnes qui ont le même code soundex, la consonne à droite de la voyelle n'est pas codée.

Des règles supplémentaires peuvent entraîner des disparités entre les valeurs calculées par la fonction SOUNDEX et les valeurs calculées sous des niveaux de compatibilité précédents. Après la mise à niveau vers le niveau de compatibilité 110, vous pouvez être amené à reconstruire les index, les segments de mémoire ou les contraintes CHECK qui utilisent la fonction SOUNDEX. Pour plus d'informations, consultez SOUNDEX (Transact-SQL).

Mots clés réservés

Le paramètre de compatibilité détermine aussi les mots clés 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

110

WITHIN GROUP, TRY_CONVERT, SEMANTICKEYPHRASETABLE, SEMANTICSIMILARITYDETAILSTABLE, SEMANTICSIMILARITYTABLE

100

CUBE, MERGE, ROLLUP

90

EXTERNAL, PIVOT, UNPIVOT, REVERT, TABLESAMPLE

À un niveau de compatibilité spécifique, les mots clés réservés incluent l'ensemble des mots clés introduits à partir de ce niveau ou sous celui-ci. Ainsi, pour les applications au niveau 110, par exemple, l'ensemble des mots clés répertoriés dans le tableau précédent sont réservés. À des niveaux de compatibilité inférieurs, les mots clés de niveau 100 demeurent des noms d'objet valides, mais les fonctions de langage de niveau 110 correspondant à ces mots clés sont indisponibles.

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

Si une application utilise un identificateur réservé en tant que mot clé pour son niveau de compatibilité, l'application échoue. Pour contourner ce problème, placez l'identificateur entre crochets ([ ]) ou entre guillemets (" ") ; par exemple, pour effectuer la mise à niveau d'une application utilisant l'identificateur EXTERNAL au niveau de compatibilité 90, vous pouvez modifier l'identificateur de la manière suivante : [EXTERNAL] ou "EXTERNAL"".

Pour plus d'informations, consultez Mots clés réservés (Transact-SQL).

Autorisations

Requiert l'autorisation ALTER sur la base de données.

Exemples

A.Modification du niveau de compatibilité

L'exemple suivant remplace le niveau de compatibilité de la base de données AdventureWorks2012 par 110, SQL Server 2012.

ALTER DATABASE AdventureWorks2012
SET COMPATIBILITY_LEVEL = 110;
GO

Voir aussi

Référence

ALTER DATABASE (Transact-SQL)

Mots clés réservés (Transact-SQL)

CREATE DATABASE (Transact-SQL)

DATABASEPROPERTYEX (Transact-SQL)

sys.databases (Transact-SQL)

sys.database_files (Transact-SQL)