2009-10-19 10 views
3

J'ai découvert (*) aujourd'hui que, selon le serveur, mes commandes TSQL étaient sensibles à la casse, ce qui signifie que lorsque la colonne d'une table est nommée tableId, l'instruction suivante peut ne pas réussir:SQL Server: impact du classement des colonnes sur les instructions T-SQL

SELECT TableId FROM myTable 

Selon le classement de la colonne. SQL_Latin1_blablabla semble ne pas être sensible à la casse, lorsque Latin1_blablabla est.

Alors ma première question est POURQUOI !!!

Et le second est: quel est le tour le plus rapide (sp?) Pour changer tous les classements pour toutes les colonnes concernées dans la base de données?

EDIT: pour rendre les choses très claires:

SELECT tableId FROM myTable 

travail sur tous les serveurs tout en

SELECT TableId FROM myTable 

Fonctionne uniquement sur le serveur avec le classement . Notez la différence entre les 2 chaînes. Nous ne parlons pas ici de collation de données, mais de l'impact de cette collation sur la façon dont nous écrivons du code!

(*) Je pourrais utiliser ici un mot supplémentaire et spécifique pour qualifier mon état d'esprit après cette « découverte », mais tous sont adultes ... note

Répondre

4

Faisant suite à marc_s

sys.objects, sys.columns etc stocker les noms de colonne et les noms d'objet dans le classement de la base de données. Ainsi, un classement binaire signifie que les noms d'objets sont traités comme binaires ...

+0

Une fois que vous l'avez dit, il semble évident ... –

5

Ceci est appelé une collation et contrôle si SQL Server traite vos chaînes comme sensibles à la casse et/ou comme sensibles aux accents (par exemple, s'il reconnaît è é et ainsi de suite, ou les traite comme ea et ainsi de suite)

Fonctionnalité - pas un bug!

Vous pouvez trouver votre collation en cours avec cette commande:

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation; 

Vous obtiendrez quelque chose comme:

Latin1_General_CI_AS 

Le "CI" signifie: cas Insensible - CS signifie Sensible à la casse serait

Le "AS" signifie: accent Sensitive (et AI serait sans accent)

Vous pouvez définir un classement standard pour votre serveur SQL au moment de l'installation, et vous pouvez le remplacer pour chaque base de données que vous créez.

Vous pouvez également créer facilement des tables et des colonnes et spécifier des classements spécifiques pour chaque champ VARCHAR.

Pour modifier le classement de la base de données, vous pouvez utiliser cette commande:

ALTER DATABASE MyDatabase COLLATE <desired collation> 

Malheureusement, il y a beaucoup des raisons pour lesquelles cette commande peut échouer .... tout ce qui est « schéma lié » empêchera le changement de classement. Dans ce cas, vous pouvez seulement laisser tomber ou désactiver tous ces "barrages routiers" et réessayer - une épreuve!

Si vous choisissez par ex."Latin1_General_CI_AS", vous ne devriez plus avoir de noms de tables et de colonnes sensibles à la casse.

Si vous voulez modifier le classement d'une seule colonne dans une table de données, utilisez cette commande:

ALTER TABLE Table1 
    ALTER COLUMN Column1 VARCHAR(20) 
    COLLATE Latin1_General_CS_AS -- or whatever collation you want 

Marc

+1

Le classement de la table ne devrait cependant pas affecter l'accès à ses colonnes. – Joey

+0

bien ... J'ai beaucoup travaillé avec les données françaises, roumaines et arabes, donc je peux comprendre l'intérêt de la collation quand il s'agit de valeurs stockées dans la base de données. Mais pourquoi cela aurait-il un impact sur la façon dont j'écris le code? –