SQL Server noms de Colonne de la casse
La DB je utiliser a French_CI_AS classement (CI doit stand pour la casse), mais est sensible à la casse, de toute façon. J'essaie de comprendre pourquoi.
La raison que j'affirme c'est que des insertions avec un "DONNÉ" cas d'installation échoue, mais ils parviennent à un autre "Donné" cas de l'installation.
Par exemple:
INSERT INTO SomeTable([GIVEN],[COLNAME]) VALUES ("value1", "value2")
échoue, maisINSERT INTO SomeTable([Given],[ColName]) VALUES ("value1", "value2")
œuvres.
MODIFIER
Viens de voir ceci:
http://msdn.microsoft.com/en-us/library/ms190920.aspx
donc, cela signifie qu'il devrait être possible de modifier une colonne de classement sans vider toutes les données et de recréer la table?
Je pense que vous avez besoin pour illustrer avec un simple (colonne 2) exemple de ce qui fonctionne et ce qui ne parvient pas. Je pense que vous pourriez dire que c'est
votre exemple est exactement liée à mon problème.
Il faut distinguer entre ce qui est stocké dans la table (les données) et les noms enregistrés dans le système de catalogue (méta-données). Si, comme vous l'indiquez, le problème est avec les noms de colonne (pas les données), alors vous avez besoin à la recherche si le SQL noms de colonnes dans une base de données sont sensibles à la casse quand délimité. Il peut également dépendre de la façon dont l'instruction CREATE TABLE est écrit (les noms par qui?). Normalement, le SQL est pas sensible à la casse sur la colonne et les noms de table; vous pouvez écrire
Leffler: Que signifie "délimité" ici...?
Dans le Standard SQL, un "identificateur délimité" est un nom de colonne, le nom de la table, ou quelque chose de similaire entre guillemets, comme
INSERT INTO SomeTable([GIVEN],[COLNAME]) VALUES (...)
échoue, mais INSERT INTO SomeTable([Given],[ColName]) VALUES (...)
œuvres. Si oui, qui pénètre dans un domaine très délicat de l'interaction entre délimité par des identificateurs (normalement sensible à la casse) et les classements (celui-ci est sensible à la casse).votre exemple est exactement liée à mon problème.
Il faut distinguer entre ce qui est stocké dans la table (les données) et les noms enregistrés dans le système de catalogue (méta-données). Si, comme vous l'indiquez, le problème est avec les noms de colonne (pas les données), alors vous avez besoin à la recherche si le SQL noms de colonnes dans une base de données sont sensibles à la casse quand délimité. Il peut également dépendre de la façon dont l'instruction CREATE TABLE est écrit (les noms par qui?). Normalement, le SQL est pas sensible à la casse sur la colonne et les noms de table; vous pouvez écrire
INSERT INTO SoMeTaBlE(GiVeN, cOlNaMe) VALUES("v1", "v2")
et si les noms n'ont jamais été délimité, ce serait OK.Leffler: Que signifie "délimité" ici...?
Dans le Standard SQL, un "identificateur délimité" est un nom de colonne, le nom de la table, ou quelque chose de similaire entre guillemets, comme
CREATE TABLE "table"(...)
. Ils sont utilisés lorsque les noms sont des mots clés ou contenir des caractères (comme l'espace) qui ne sont normalement pas autorisés dans les identificateurs. Dans SQL Server, délimité par des identificateurs sont entre crochets: [GIVEN]
etc. MySQL utilise en arrière-tiques pour le même travail. C'est pourquoi il est crucial que vous nous montrer ce que vous êtes en utilisant. Il y a des arcanes pièces SQL (et délimité par l'identificateur de manutention est l'un d'entre eux), mais lorsque vous exécutez faute de cela, vous avez à apprendre.
OriginalL'auteur Skippy Fastol | 2012-05-03
Vous devez vous connecter pour publier un commentaire.
Compte tenu de cette pièce essentielle de l'information (qui est dans un commentaire sur la question et de ne pas dans, la question réelle):
il est logique que les noms de colonne sont considérés comme sensibles à la casse, même dans une casse DB, puisque c'est la façon dont le
SqlBulkCopy
Classe fonctionne. Veuillez voir Mappages de colonnes dans SqlBulkCopy sont sensibles à la casse.NOTES COMPLÉMENTAIRES
Lorsque vous posez une question, s'il vous plaît ne pas changer les circonstances que vous avez à faire. Par exemple, la question des états (nous soulignons):
Encore l'exemple des énoncés simples
INSERT
s. Aussi, un commentaire sur la question des états:À l'aide .NET et
SqlBulkCopy
est waaaay différent que d'utiliserBULK INSERT
ouINSERT
, faisant de la question en cours trompeuse, il est difficile (voire impossible) de trouver la bonne réponse. Cette nouvelle peu d'info aussi conduit à plus de questions, parce que lors de l'utilisation deSqlBulkCopy
, vous n'écrivez pas toutINSERT
états: il vous suffit d'écrire unSELECT
déclaration et spécifiez le nom de la Table de destination. Si vous spécifiez les noms de colonne de la Table de destination, il est dans l'option mappage de colonnes. Est-ce là la question?Sur le "MODIFIER" de la question:
Non, la modification du Classement de la colonne ne va pas aider du tout, même si vous n'utilisiez pas
SqlBulkCopy
. Le Classement d'une colonne détermine comment données stockées dans la colonne se comporte, et non pas les noms de colonne (notamment les méta-données de la Table) se comporte. C'est le Classement de la Base de données elle-même qui détermine la façon dont la Base de données d'objet de niveau méta-données se comporte. Et dans ce cas, vous prétendez que la DB est à l'aide d'un Classement de casse (le bon, la_CI_
partie du Classement nom signifie "Case jensensitive").Concernant les déclarations suivantes faites par Jonathan Leffler sur la question:
Non, délimité par des identificateurs ne sont généralement pas sensibles à la casse. Les sensibilités (cas, l'accent, kana type, la largeur, et, à partir de SQL Server 2017 sélecteur de variante) d'identificateurs délimités est le même que pour les non-délimité par des identificateurs à ce même niveau. "Même niveau" signifie qu'au niveau de l'Instance (les noms des Bases de données, Connexions, etc) sont contrôlés par le niveau de l'Instance de Classement, tandis que le niveau de la Base de noms (Schémas, Objets: Tables, Vues, Fonctions, Procédures Stockées, etc..., des Utilisateurs, etc) sont contrôlés par la Base de données de niveau de Classement. Et ces deux niveaux peut avoir différents Classements.
Il n'a pas d'importance si les noms de colonne ont été délimitées ou non lors de la création de la Table, du moins pas en termes de la façon dont leur résolution est manipulé. Les noms de colonne sont au niveau de la Base de méta-données, et qui est contrôlée par le Classement par défaut de la Base de données. Et il est le même pour tous les niveau de la Base de méta-données à l'intérieur de chacune des Bases de données. Vous ne pouvez pas avoir quelques noms de colonne étant sensible à la casse, alors que d'autres sont insensibles à la casse.
Aussi, il n'y a rien de spécial à propos de la Table et les noms de colonne. Ils sont au niveau de la Base de méta-données comme les noms d'Utilisateur, les noms de schémas, Index des noms, etc. L'ensemble de cette méta-données est contrôlée par la Base de données par défaut du Classement.
Méta-données (à la fois au niveau de l'Instance et la Base de données-niveau) n'est "normalement" pas sensible à la casse, vu le défaut de Classement proposé lors de l'installation en cours d'un Classement de casse.
Il est plus exact de dire que délimité par un identificateur est un identificateur enfermé dans quelque nature que ce soit(s) le SGBD en question a défini comme délimiteurs. Et qui des caractères particuliers sont utilisés pour les délimiteurs varie entre les différents Sgbd.
Tandis que les crochets fonctionnent toujours comme des séparateurs pour les identifiants, il est possible d'utiliser les doubles guillemets comme délimiteurs SI vous avez le niveau de la session de la propriété de
QUOTED_IDENTIFIER
ensemble deON
(ce qui est préférable de toujours faire de toute façon).Bien, délimité par des identificateurs sont en fait assez simple. Le point de l'ensemble de la délimitation d'un identificateur est effectivement ignorer les règles de l'ordinaire (c'est à dire non délimité) les identificateurs. Mais, en termes d'identificateurs réguliers, oui, ces règles sont plutôt des arcanes (principalement en raison de la documentation officielle incomplète et incorrecte). Ainsi, afin de prendre le mystère de la façon dont les identifiants SQL Server, j'ai fait un tas de recherches et a publié les résultats ici (ce qui inclut des liens pour la recherche elle-même):
Complètement Liste Complète des Règles de T-SQL Identifiants
Pour plus d'infos sur les Classements /Codages Unicode //ASCII, d'autant qu'ils se rapportent à Microsoft SQL Server, visitez le site:
Collations.Info
[]
que les cours des identificateurs délimités, entre autres, des différences cruciales, et le Standard SQL t, exige le respect de la casse dans les identificateurs délimités).Vous pourriez être correct re: "le Standard SQL", mais c'est sans importance à cette question, car: a cette question est spécifique à Microsoft SQL Server, et b) incorrecte appliquer ces "Standard SQL" règles de SQL Server où ils ne s'appliquent évidemment pas. Dans chacun de vos commentaires sur la question de l'état, ou de suggérer que SQL Server fonctionne selon ces "Standard SQL" règles, et de se concentrer sur si oui ou non les noms de colonne ont été délimitées lors de la création de la table, etc. Mais rien de cela n'est applicable ici, et il est donc trompeur dans ce contexte. C'est ce que je suis clarifier.
OriginalL'auteur Solomon Rutzky
Vérifier le classement des colonnes dans votre définition de la table, et le classement de la base de données tempdb (c'est à dire le classement du serveur). Ils peuvent différer de votre classement de base de données.
voir msdn.microsoft.com/en-us/library/ms175835.aspx
et Anthony: s'il est vrai qu'il pourrait y avoir des différences dans les 3 Classements, qui n'a rien à voir avec la question que l'O. P. est d'avoir. Le problème n'est pas avec les données dans de la colonne, mais avec les noms de colonnes elles-mêmes, qui sont à la Base de données au niveau des méta-données. Ceci est contrôlé par la Base de données par défaut du Classement, mais même cela n'est pas pertinent lors de l'utilisation de
SqlBulkCopy
. Veuillez voir le mon répondre pour plus de détails.OriginalL'auteur Anthony Faull
Le fait que les noms de colonne sont sensibles à la casse signifie que la base de données MASTER a été créé à l'aide d'un classement sensible à la casse.
Dans le cas j'ai juste eu qui m'ont amené à étudier cette question, quelqu'un est entré
Latin1_CS_Aje au lieu de Latin1_Cje_AS
Lors de la configuration de SQL server.
master
de la Base de données n'a rien à voir avec la façon dont les noms des colonnes (c'est à dire au niveau de la Base de méta-données) sont traités en dehors du système DBs (master
,model
,msdb
, ettempdb
). Maintenant, lamodel
DB est utilisé comme modèle pour la création de nouveaux DBs, mais le Classement de la non-système DBs peut être changé facilement. Il peut être réglé différemment en faisantCREATE DATABASE {db_name} COLLATE {collation_name};
, ou il peut être modifié plus tard parALTER DATABASE {db_name} COLLATE {new_collation_name};
. Veuillez voir le mon répondre pour plus de détails.OriginalL'auteur Roger Willcocks