Priorité de classement

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL analytics endpoint in Microsoft Fabric Warehouse in Microsoft Fabric

La priorité du classement, également appelée règles de contrainte de classement, détermine les deux résultats suivants :

  • le classement du résultat final d'une expression évaluée en une chaîne de caractères ;

  • le classement utilisé par certains opérateurs, tels que LIKE et IN, qui utilisent des entrées de chaînes de caractères, mais ne renvoient pas une chaîne de caractères.

Les règles de priorité de classement s’appliquent uniquement aux types de données de chaînes de caractères : char, varchar, text, nchar, nvarchar et ntext. Les objets comportant d'autres types de données n'interviennent pas dans les évaluations de classement.

Étiquettes de classement

Le tableau suivant répertorie et décrit les quatre catégories de classement des objets. Le nom de chaque catégorie est identifié par une étiquette de classement.

Étiquette de classement Types d’objets
Coercible-default Toute variable de chaîne de caractères Transact-SQL, tout paramètre, littéral, résultat d'une fonction de catalogue intégrée ou toute fonction intégrée qui ne prend pas les entrées de type chaîne, mais produit un résultat de type chaîne.

Si l'objet est déclaré dans une fonction définie par l'utilisateur, une procédure stockée ou un déclencheur, il se voit attribuer le classement par défaut de la base de données dans lequel la fonction, la procédure stockée ou le déclencheur est créé. Si l'objet est déclaré dans un traitement, le classement par défaut de la base de données actuelle lui est attribué pour la connexion.
Implicit X Référence de colonne. Le classement de l'expression (X) provient du classement défini pour la colonne dans la table ou la vue.

Même si la colonne a été explicitement affectée à un classement à l’aide d’une COLLATE clause dans l’instruction ou CREATE VIEW de l’instructionCREATE TABLE, la référence de colonne est classifiée comme implicite.
Explicit X Expression explicitement convertie en un classement spécifique (X) à l'aide d'une clause COLLATE dans l'expression.
No-collation Indique que la valeur d'une expression est le résultat d'une opération entre deux chaînes dont l'étiquette de classement implicite génère des classements conflictuels. Le résultat de l'expression est défini comme étant dépourvu d'un classement.

Règles de classement

L'étiquette de classement d'une expression simple qui fait référence à un seul objet de chaîne de caractère représente l'étiquette de classement de l'objet en référence.

L'étiquette de classement d'une expression complexe qui fait référence à deux expressions d'opérandes dotées de la même étiquette de classement constitue l'étiquette de classement des expressions d'opérandes.

L'étiquette de classement du résultat final d'une expression complexe qui fait référence à deux expressions d'opérandes comportant des classements différents obéit aux règles suivantes :

  • L'étiquette Explicite est prioritaire par rapport à l'étiquette Implicite. L'étiquette Implicite est prioritaire par rapport à l'étiquette Contrainte par défaut.

    Explicite > Implicite > Contrainte par défaut

  • La combinaison de deux expressions explicites affectées à des classements différents génère une erreur.

    X explicite + Y explicite = Erreur

  • La combinaison de deux expressions implicites affectées à des classements différents produit un résultat dépourvu de classement :

    X implicite + Y implicite = Sans classement

  • La combinaison d'une expression sans classement avec une expression d'une étiquette, à l'exception d'un classement explicite (voir règle suivante), produit un résultat comportant l'étiquette Sans classement (No-collation) :

    Sans classement + autre classement = Sans classement

  • La combinaison d'une expression sans classement avec une expression dotée d'un classement explicite produit une expression affectée d'une étiquette explicite :

    Sans classement + X explicite = Explicite

Le tableau suivant récapitule les différentes règles.

Étiquette de contrainte d'opérande X explicite X implicite Contrainte par défaut Sans classement
Explicit Y Génère une erreur Le résultat est Y explicite Le résultat est Y explicite Le résultat est Y explicite
Implicit Y Le résultat est X explicite Le résultat est Sans classement Le résultat est Y implicite Le résultat est Sans classement
Coercible-default Le résultat est X explicite Le résultat est X implicite Le résultat est Contrainte par défaut Le résultat est Sans classement
No-collation Le résultat est X explicite Le résultat est Sans classement Le résultat est Sans classement Le résultat est Sans classement

Les règles supplémentaires suivantes s'appliquent également à la priorité de classement :

  • Une expression explicite ne peut pas avoir plusieurs clauses COLLATE. Par exemple, la clause WHERE suivante n'est pas valide car une clause COLLATE est spécifiée pour une expression qui est déjà explicite :

    WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_AS

  • Les conversions de pages de codes pour les types de données text ne sont pas autorisées. Vous ne pouvez pas effectuer un cast d’une expression de type texte d’un classement à l’autre si les pages de codes de ces derniers sont différentes. L'opérateur d'affectation ne peut pas attribuer de valeurs si le classement de l'opérande texte de droite utilise une page de codes différente de l'opérande texte de gauche.

La priorité de classement est déterminée après la conversion du type de données. L'opérande qui détermine le classement résultant peut être différent de l'opérande qui fournit le type de données du résultat final. Par exemple, étudiez le traitement ci-dessous :

CREATE TABLE TestTab  
   (PrimaryKey int PRIMARY KEY,  
    CharCol char(10) COLLATE French_CI_AS  
   )  
  
SELECT *  
FROM TestTab  
WHERE CharCol LIKE N'abc'  

Remarque

Le type de données nvarchar n’est pas pris en charge dans Fabric Warehouse, mais la plupart des exemples de cet article s’appliquent à la fois à varchar à l’aide d’UTF-8 et de nvarchar, et restent applicables à Fabric Warehouse, sauf indication contraire.

Le type de données Unicode de l'expression simple N'abc' est prioritaire. Par conséquent, l'expression résultante a le type de données Unicode affecté à N'abc'. Cependant, l'expression CharCol a l'étiquette de classement Implicite, alors que N'abc' est associé à une étiquette de contrainte inférieure de Contrainte par défaut. Le classement French_CI_AS de CharCol sera dès lors utilisé.

Exemples de règles de classement

Les exemples suivants illustrent le fonctionnement des règles de classement. Pour exécuter les exemples, créez la table test suivante.

USE tempdb;  
GO  
  
CREATE TABLE TestTab (  
   id int,   
   GreekCol nvarchar(10) collate greek_ci_as,   
   LatinCol nvarchar(10) collate latin1_general_cs_as  
   )  
INSERT TestTab VALUES (1, N'A', N'a');  
GO  

Conflit de classement et erreur

Dans la requête suivante, le prédicat présente un conflit de classement et génère une erreur.

SELECT *   
FROM TestTab   
WHERE GreekCol = LatinCol;  

Voici le jeu de résultats.

Msg 448, Level 16, State 9, Line 2  
Cannot resolve collation conflict between 'Latin1_General_CS_AS' and 'Greek_CI_AS' in equal to operation.  

Étiquette explicite et étiquette implicite

Dans la requête suivante, le prédicat est analysé dans le classement greek_ci_as, car l'expression de droite comporte l'étiquette Explicite. Celle-ci est prioritaire par rapport à l'étiquette Implicite de l'expression de gauche.

SELECT *   
FROM TestTab   
WHERE GreekCol = LatinCol COLLATE greek_ci_as;  

Voici le jeu de résultats.

id          GreekCol             LatinCol  
----------- -------------------- --------------------  
          1 A                    a  
  
(1 row affected)  

Étiquettes sans classement

Remarque

En raison de la différence entre le comportement de nvarchar et varchar dans un classement UTF-8, cet exemple ne s’applique pas dans Fabric Warehouse.

Dans les requêtes suivantes, les expressions CASE ont l'étiquette Sans classement. Elles ne peuvent donc pas apparaître dans la liste de sélection, ni être traitées par les opérateurs qui respectent le classement. Toutefois, les expressions peuvent être traitées par les opérateurs qui ne respectent pas le classement.

SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END)   
FROM TestTab;  

Voici le jeu de résultats.

Msg 451, Level 16, State 1, Line 1  
Cannot resolve collation conflict for column 1 in SELECT statement.  
SELECT PATINDEX((CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END), 'a')  
FROM TestTab;  

Voici le jeu de résultats.

Msg 446, Level 16, State 9, Server LEIH2, Line 1  
Cannot resolve collation conflict for patindex operation.  
SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END) COLLATE Latin1_General_CI_AS   
FROM TestTab;  

Voici le jeu de résultats.

--------------------  
a  
  
(1 row affected)  

Respect du classement et insensible au classement

Les opérateurs et les fonctions respectent ou non le classement.

  • Respect du classement : cela signifie que la spécification d’un opérande sans classement est une erreur au moment de la compilation. Le résultat de l'expression ne peut être de type sans classement.
  • Classement insensible : cela signifie que les opérandes et le résultat peuvent être sans classement.

Opérateurs et classement

Les opérateurs de comparaison, ainsi que les MAXopérateurs , , LIKEMINBETWEENet IN les opérateurs, sont sensibles au classement. La chaîne utilisée par les opérateurs se voit attribuer l'étiquette de classement de l'opérande comportant le degré de priorité le plus élevé. L’instruction UNION est également sensible au classement, et tous les opérandes de chaîne et le résultat final est affecté au classement de l’opérande avec la priorité la plus élevée. La priorité du classement de l’opérande et le UNION résultat sont évalués par colonne.

L'opérateur d'affectation ne respecte pas le classement et l'expression de droite est affectée au classement de gauche.

L'opérateur de concaténation de chaînes respecte le classement, les deux opérandes de chaînes et le résultat se voient attribuer l'étiquette de classement de l'opérande comportant la priorité de classement la plus élevée. Les UNION ALL instructions et CASE les instructions ne respectent pas le classement, et tous les opérandes de chaîne et les résultats finaux reçoivent l’étiquette de classement de l’opérande avec la priorité la plus élevée. La précédence du classement des opérandes et du UNION ALL résultat est évaluée par colonne.

Fonctions et classement

THE CAST, CONVERTet COLLATE les fonctions sont sensibles au classement pour les types de données char, varchar et texte . Si l’entrée et la CAST CONVERT sortie des fonctions sont des chaînes de caractères, la chaîne de sortie a l’étiquette de classement de la chaîne d’entrée. Si l’entrée n’est pas une chaîne de caractères, la chaîne de sortie est coercible par défaut et affecte le classement de la base de données active pour la connexion, ou la base de données qui contient la fonction définie par l’utilisateur, la procédure stockée ou le déclencheur dans lequel le CAST ou CONVERT l’objet est référencé.

Pour les fonctions intégrées qui retournent une chaîne, mais qui ne prennent pas d’entrée de chaîne, la chaîne de résultat est Coercible-default. La chaîne de résultat est affectée au classement de la base de données active ou au classement de la base de données qui contient la fonction définie par l’utilisateur, la procédure stockée ou le déclencheur dans lequel la fonction est référencée.

Les fonctions suivantes respectent le classement et leurs chaînes résultantes ont l'étiquette de classement de la chaîne d'entrée :

CHARINDEX

REPLACE

DIFFERENCE

REVERSE

ISNUMERIC

RIGHT

LEFT

SOUNDEX

LEN

STUFF

LOWER

SUBSTRING

PATINDEX

UPPER