Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Point de terminaison d’analytique SQL dans Microsoft Fabric
Entrepôt dans Microsoft Fabric
Base de données SQL dans 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 ;
Classement utilisé par les opérateurs sensibles au classement qui utilisent des entrées de chaîne de caractères, mais qui ne retournent pas de chaîne de caractères, comme
LIKEIN.
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 qui ont d’autres types de données ne participent pas aux é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 l’étiquette de classement.
| Étiquette de classement | Types d’objets |
|---|---|
Coercible-default |
Tout Transact-SQL variable de chaîne de caractères, paramètre, littéral ou sortie d’une fonction intégrée de catalogue ou d’une fonction intégrée qui ne prend pas d’entrées de chaîne, mais génère une sortie de 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 TABLE de l’instructionCREATE VIEW, la référence de colonne est classifiée comme implicite. |
Explicit X |
Expression qui est explicitement castée en un classement spécifique (X) à l’aide d’une COLLATE clause 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 :
Vous ne pouvez pas avoir plusieurs
COLLATEclauses sur une expression qui est déjà une expression explicite. Par exemple, la clause suivanteWHEREn’est pas valide, car uneCOLLATEclause est spécifiée pour une expression qui est déjà une expression explicite :WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_ASLes conversions de pages de code pour les types de données texte ne sont pas autorisées. Vous ne pouvez pas convertir une expression de texte d’un classement à un autre s’ils ont les différentes pages de code. L’opérateur d’affectation ne peut pas affecter de valeurs lorsque le classement de l’opérande de texte droit a une page de codes différente de celle de l’opérande de texte 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 de UTF-8 et nvarchar, et restent donc 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
É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.
Les CASE expressions des requêtes suivantes ont une étiquette sans classement ; par conséquent, elles ne peuvent pas apparaître dans la liste de sélection ou être exploitées par des opérateurs sensibles au 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
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 pas être no-collation.
- 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 , , MINBETWEENLIKEet 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
Les CASTfonctions et CONVERT les COLLATEfonctions sont sensibles au classement pour les types de données char, varchar et texte. Si l’entrée et la CASTCONVERT 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 affectée au 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 :
CHARINDEXDIFFERENCEISNUMERICLEFTLENLOWERPATINDEXREPLACEREVERSERIGHTSOUNDEXSTUFFSUBSTRINGUPPER