Savoir quelles collations sont utilisées au niveau colonne, base de données et instance SQL Server

Comme il est important de savoir si la collation utilisée par une colonne, une base de données ou une instance SQL Server est sensible à la casse ou aux accents, ou …, voici quelques requêtes qui permettent d’obtenir l’information très simplement :

=> Au niveau colonne :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-------------------------------
-- Nicolas Souquet - 27/08/2011
-------------------------------
SELECT    S.name + '.' + T.name AS table_name
    , C.name AS column_name
    , C.collation_name AS column_collation_name
    , FHC.description AS collation_description
FROM    sys.columns AS C
INNER JOIN  sys.tables AS T
      ON T.object_id = C.object_id
INNER JOIN  sys.schemas AS S
      ON S.schema_id = T.schema_id
INNER JOIN  sys.fn_helpcollations() AS FHC
      ON C.collation_name = FHC.name
WHERE    S.name = 'dbo'
AND    T.name = 'maTable'
AND    C.name = 'maColonne'

=> Au niveau base de données :

1
2
3
4
5
6
7
8
9
10
-------------------------------
-- Nicolas Souquet - 27/08/2011
-------------------------------
SELECT    D.name AS database_name
    , D.collation_name AS database_collation_name
    , FHC.description AS collation_description
FROM    sys.databases AS D
INNER JOIN  sys.fn_helpcollations() AS FHC
      ON D.collation_name = FHC.name
--WHERE    D.name = 'leNomDeVotreBaseDeDonnees'

=> Au niveau de l’instance SQL Server

1
2
3
4
5
6
7
8
-------------------------------
-- Nicolas Souquet - 27/08/2011
-------------------------------
SELECT    SC.server_collation_name
    , FHC.description AS server_collation_name
FROM    (SELECT  SERVERPROPERTY('Collation') AS server_collation_name) AS SC
INNER JOIN  sys.fn_helpcollations() AS FHC
      ON SC.server_collation_name = FHC.name

Pour en savoir un peu plus sur les collations dans SQL Server, je vous conseille de lire l’article de SQLPro à ce sujet.

Bon tri de chaînes !

Une réflexion au sujet de « Savoir quelles collations sont utilisées au niveau colonne, base de données et instance SQL Server »

  1. Bonjour Nicolas,

    Il me semble qu’il y a une coquille dans la requête collation niveau colonne.

    Prenons un exemple :

    –>Pour une collation serveur French_CI_AS

    1
    2
    3
    4
    5
    6
    7
    &nbsp;<br />
    SELECT SERVERPROPERTY('CollationID') [IDCollationServer],SERVERPROPERTY('Collation' [CollationServer]&nbsp;<br />
    &nbsp;<br />
    IDCollationServer&nbsp;&nbsp;CollationServer&nbsp;<br />
    ----------------&nbsp;&nbsp;--------------------&nbsp;<br />
    &nbsp;<br />
    53259&nbsp;&nbsp;                 French_CI_AS&nbsp;<br />

    –> Et une base de données de collation Latin1_General_CS_AS

    1
    2
    3
    4
    5
    6
    7
    8
    &nbsp;<br />
    SELECT name [Base], collation_name [CollationBase] FROM sys.databases WHERE name = 'AdventureWorks'&nbsp;<br />
    &nbsp;<br />
    &nbsp;<br />
    Base&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CollationBase&nbsp;<br />
    ----&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------------&nbsp;<br />
    AdventureWorks&nbsp;&nbsp;&nbsp;&nbsp;        Latin1_General_CS_AS&nbsp;<br />
    &nbsp;<br />

    L’exécution de la requête suivante :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    &nbsp;<br />
    SELECT    S.name + '.' + T.name AS table_name &nbsp;<br />
    &nbsp;   , C.name AS column_name &nbsp;<br />
    &nbsp;   , C.collation_name AS column_collation_name &nbsp;<br />
    &nbsp;   , FHC.description AS collation_description &nbsp;<br />
    FROM    sys.columns AS C &nbsp;<br />
    INNER JOIN  sys.tables AS T &nbsp;<br />
    &nbsp;     ON T.object_id = C.object_id &nbsp;<br />
    INNER JOIN  sys.schemas AS S &nbsp;<br />
    &nbsp;     ON S.schema_id = T.schema_id &nbsp;<br />
    INNER JOIN  sys.fn_helpcollations() AS FHC &nbsp;<br />
    &nbsp;     ON C.collation_name = FHC.name&nbsp;<br />
    &nbsp;<br />
    WHERE    S.name = 'Person' &nbsp;<br />
    AND    T.name = 'Contact'&nbsp;<br />

    Renvoie une erreur classique connue :


    Msg 468, Niveau 16, État 9, Ligne 11
    Impossible de résoudre le conflit de classement entre « French_CI_AS » et « Latin1_General_CS_AS » dans l’opération equal to.

    –> Contournement

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    &nbsp;<br />
    SELECT    S.name + '.' + T.name AS table_name &nbsp;<br />
    &nbsp;   , C.name AS column_name &nbsp;<br />
    &nbsp;   , C.collation_name AS column_collation_name &nbsp;<br />
    &nbsp;   , FHC.description AS collation_description &nbsp;<br />
    FROM    sys.columns AS C &nbsp;<br />
    INNER JOIN  sys.tables AS T &nbsp;<br />
    &nbsp;     ON T.object_id = C.object_id &nbsp;<br />
    INNER JOIN  sys.schemas AS S &nbsp;<br />
    &nbsp;     ON S.schema_id = T.schema_id &nbsp;<br />
    INNER JOIN  sys.fn_helpcollations() AS FHC &nbsp;<br />
    &nbsp;     ON C.collation_name = FHC.name COLLATE database_default&nbsp;<br />
    &nbsp;<br />
    WHERE    S.name = 'Person' &nbsp;<br />
    AND    T.name = 'Contact'&nbsp;<br />
    &nbsp;<br />
    &lt;code&gt;&nbsp;<br />
    &nbsp;<br />
    &nbsp;<br />
    &nbsp;<br />
    &nbsp;<br />

Laisser un commentaire