2009-01-30 25 views
3

Dans SQL Server (2000 ou 2005) est-il possible de définir la base de données ou le classement du serveur afin que les noms d'identificateur (tables, colonnes, etc) doivent être dans le bon cas? Si oui, est-ce vrai pour tous les classements sensibles à la casse ou est-ce un paramètre distinct? (J'ai toujours pensé que la sensibilité à la casse s'appliquait aux données, pas aux noms d'objets).Est-ce que sqlserver collation signifie que les noms de colonnes doivent être corrects? Et comment faire face à cela

Vraisemblablement, cela casserait une application si ses procédures et requêtes stockées n'étaient pas écrites avec un cas cohérent? Existe-t-il un moyen de résoudre ce problème sans avoir à vérifier que toutes les requêtes utilisent le bon cas, par exemple pour définir le classement d'une connexion à une base de données? Je regarde cela du point de vue d'avoir une application existante qui a probablement inclus du code sql de manière incohérente, et je veux pouvoir l'exécuter sur des bases de données avec des classements différents. De quels paramètres aurais-je besoin ou quel ensemble de classements de base de données/serveur ne pourrais-je pas utiliser l'application?

Répondre

2

La collation est ce qui détermine si vos requêtes seront insensibles à la casse. La seule façon de garantir que votre schéma fonctionnera dans plusieurs environnements est donc d'avoir des requêtes sensibles à la casse. Si vos requêtes ne sont pas cohérentes, votre classement DOIT être insensible à la casse sinon il ne fonctionnera pas.

http://msdn.microsoft.com/en-us/library/aa174903(SQL.80).aspx

Une chose à noter est qu'une fois que vous avez configuré votre environnement SQL Server avec une certaine collation, vous ne pouvez pas changer sans créer une instance SQL Server NOUVEAU. Donc, Case-Insensitive est généralement le chemin à parcourir. Et puis efforcez-vous d'avoir de la cohérence dans vos requêtes.

Une fois qu'un classement est défini, il s'applique à la fois aux données et aux métadonnées, je crois.

0

Vous pouvez définir le classement pour chaque objet et définir également une valeur par défaut pour la base de données et le serveur.

Comment faire avec? Vous devez appliquer des normes ici. Vous pouvez facilement vous emmêler avec différentes personnes écrivent avec un cas différent.

La collation applique également aux données pour « bob »! = « Bob »

1

Le classement est défini dans les versions antérieures de SQL Server, mais en 2005 et au-delà, vous pouvez le modifier par objet, au fur et à mesure de leur création.

+0

Bien que cela soit vrai, il reste certains problèmes liés au TEMPDB obtenant le classement du serveur. Ainsi, tout proc stocké qui utilise le tempdb sera CaseSensitive si le serveur est, même si le DB dont vous exécutez le proc stocké est caseInsensitive. – DevinB

1

Le classement par défaut de base de données détermine si les objets dans la base de données sont traitées de manière sensible à la casse dans les requêtes - cela s'applique à tous les noms d'objets: tables, colonnes, etc.

Si votre code d'application provient d'un cas il ne peut pas s'exécuter sur une base de données de classement sensible à la casse si un objet est mal référencé (vous obtiendriez un message lorsque vous tenteriez d'exécuter l'instruction ou créeriez la procédure stockée, ou dans une architecture attraper tout cela assez rapidement, sauf si vous aviez une quantité significative de SQL dynamique). N'oubliez pas que même si votre code s'exécute, des colonnes individuelles peuvent être définies avec des classements qui diffèrent de la base de données. Il est donc toujours possible qu'avec un classement différent votre code se comporte de manière inattendue (par exemple, GROUP BY se comporte différemment) .