SQL Server-Spalte-Namen die groß-und Kleinschreibung
Der DB ich benutze hat French_CI_AS Sortierung (CI stehen für groß-und Kleinschreibung), aber groß-und Kleinschreibung sowieso. Ich versuche zu verstehen, warum.
Der Grund, warum ich behaupten, diese ist, dass bulk-inserts mit einem 'GEGEBENEN' Fall setup fehl, aber Sie sind erfolgreich, mit einem 'Gegebenen' Fall setup.
Beispiel:
INSERT INTO SomeTable([GIVEN],[COLNAME]) VALUES ("value1", "value2")
nicht, aberINSERT INTO SomeTable([Given],[ColName]) VALUES ("value1", "value2")
funktioniert.
BEARBEITEN
Gerade gesehen:
http://msdn.microsoft.com/en-us/library/ms190920.aspx
so, dass heißt, es sollte möglich sein, die änderung einer Spalte, die die Sortierung ohne Entleerung alle Daten und Neuerstellung der zugehörigen Tabelle?
Ich glaube, Sie brauchen, um zu veranschaulichen, mit einem einfachen (2 Spalte) Beispiel dafür, was funktioniert und was fehlschlägt. Ich denke, man könnte sagen
dein Beispiel ist genau das in Bezug auf mein problem.
Sie müssen unterscheiden zwischen dem, was in der Tabelle gespeichert ist (die Daten) und die gespeicherten Namen in den system-Katalog (meta-Daten). Wenn, wie Sie angeben, das problem mit dem Spalten-Namen (aber nicht die Daten selbst), dann werden Sie brauchen, um Forschung, ob die SQL-Spalte-Namen in einer Datenbank auf groß-und Kleinschreibung, wenn getrennt. Es kann auch davon abhängen, wie die CREATE TABLE-Anweisung geschrieben (waren die Namen abgegrenzt?). Normalerweise SQL ist case-insensitive-Spalte und Tabelle Namen; Sie konnte schreiben
Leffler: Was bedeutet "getrennte" stehen denn hier...?
In Standard-SQL eine "delimited identifier" ist ein Spaltenname, Tabellenname, oder etwas ähnliches, eingeschlossen in doppelte Anführungszeichen, z.B.
INSERT INTO SomeTable([GIVEN],[COLNAME]) VALUES (...)
scheitert aber INSERT INTO SomeTable([Given],[ColName]) VALUES (...)
funktioniert. Wenn dem so ist, wird in einem sehr heiklen Bereich, der die Interaktion zwischen delimited identifiers (begrenzte Bezeichner (normalerweise case-sensitive) und Sortierungen (case-insensitive).dein Beispiel ist genau das in Bezug auf mein problem.
Sie müssen unterscheiden zwischen dem, was in der Tabelle gespeichert ist (die Daten) und die gespeicherten Namen in den system-Katalog (meta-Daten). Wenn, wie Sie angeben, das problem mit dem Spalten-Namen (aber nicht die Daten selbst), dann werden Sie brauchen, um Forschung, ob die SQL-Spalte-Namen in einer Datenbank auf groß-und Kleinschreibung, wenn getrennt. Es kann auch davon abhängen, wie die CREATE TABLE-Anweisung geschrieben (waren die Namen abgegrenzt?). Normalerweise SQL ist case-insensitive-Spalte und Tabelle Namen; Sie konnte schreiben
INSERT INTO SoMeTaBlE(GiVeN, cOlNaMe) VALUES("v1", "v2")
und wenn die Namen waren nie getrennt, wäre es OK.Leffler: Was bedeutet "getrennte" stehen denn hier...?
In Standard-SQL eine "delimited identifier" ist ein Spaltenname, Tabellenname, oder etwas ähnliches, eingeschlossen in doppelte Anführungszeichen, z.B.
CREATE TABLE "table"(...)
. Sie werden verwendet, wenn die Namen sind Schlüsselwörter oder Zeichen enthalten (z.B. Leerzeichen) , werden in der Regel nicht zulässig in Bezeichnern. In SQL Server, begrenzte Bezeichner sind in eckige Klammern eingeschlossen: [GIVEN]
etc. MySQL hingegen benutzt back-ticks für den gleichen job. Deshalb ist es wichtig, dass Sie zeigen uns, was Sie verwenden. Es gibt Arkane Teile auf SQL (und begrenzungsbezeichner Handhabung ist einer von Ihnen), aber wenn du foul von es, müssen Sie lernen.InformationsquelleAutor Skippy Fastol | 2012-05-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Angesichts dieses kritische Stück von Informationen (das heißt in einem Kommentar auf die Frage und nicht in die eigentliche Frage):
macht es Sinn, dass die Namen der Spalten behandelt werden, wie groß-und Kleinschreibung, sogar in groß-und Kleinschreibung in DB, da, wie die
SqlBulkCopy
Klasse funktioniert. Bitte sehen Spaltenzuordnungen in SqlBulkCopy-und Kleinschreibung.ZUSÄTZLICHE HINWEISE
Wenn Sie eine Frage stellen, bitte nicht die Umstände ändern, die Sie zu tun haben. Zum Beispiel die Frage, Staaten (Hervorhebung Hinzugefügt):
Doch die Beispiel-statements sind einzelne
INSERT
s. Auch einen Kommentar auf die Frage Staaten:Verwenden .NET und
SqlBulkCopy
ist viiiiel anders als mitBULK INSERT
oderINSERT
, so dass die aktuelle Frage irreführend, so dass es schwer (oder sogar unmöglich) richtig zu beantworten. Dieses neue bit of info führt auch zu mehr Fragen, weil bei der Verwendung vonSqlBulkCopy
Sie nicht schreibenINSERT
Aussagen: Sie schreiben einfach eineSELECT
Anweisung, und geben Sie den Namen der Ziel-Tabelle. Wenn Sie Spaltennamen angeben an alle für die Ziel-Tabelle, ist es in der optionalen Spalte Zuordnungen. Ist, wo das Problem ist?Bezug auf die "BEARBEITEN" - Abschnitt der Frage:
Nein, das ändern der Sortierung der Spalte überhaupt nicht helfen, selbst wenn du nicht mit
SqlBulkCopy
. Die Sortierung einer Spalte bestimmt, wie in der Spalte gespeicherten Daten verhält, nicht, wie die Spaltennamen (also meta-Daten der Tabelle) verhält. Es ist die Sortierung der Datenbank selbst, die bestimmt, wie Datenbank-Ebene Objekt meta-Daten verhält. Und in diesem Fall, Sie behaupten, dass die DB ist eine groß- /Kleinschreibung Sortierung (richtig, die_CI_
Teil der Sortierung name bedeutet "Case ichnsensitive").Bezug auf die folgenden Aussagen von Jonathan Leffler auf die Frage:
Nein, begrenzte Bezeichner sind normalerweise nicht case-sensitive. Die Empfindlichkeiten (Kleinschreibung, Akzent, kana-Typ, die Breite, und ab SQL Server 2017 variation selector) von delimited identifiers (begrenzte Bezeichner ist die gleiche wie für nicht-delimited identifiers auf dieselbe Ebene. "Gleiches Niveau" bedeutet, dass die Instanz-level-Namen (Datenbanken, Logins, usw) gesteuert werden, indem die Instanz-Ebene, Sortierung, während der Datenbank-Ebene Namen (Schemas, Objekte--Tabellen, Sichten, Funktionen, Gespeicherte Prozeduren, usw.--, Benutzer, usw) gesteuert werden, die von der Datenbank-Ebene-Sortierung. Und diese beiden Ebenen können unterschiedliche Sortierungen.
Ist es egal, ob die Spalte die Namen wurden getrennt oder nicht beim erstellen der Tabelle, zumindest nicht in Bezug darauf, wie Ihre Auflösung behandelt wird. Die Spaltennamen der Datenbank-Ebene meta-Daten, und das ist gesteuert von der Standardsortierung der Datenbank. Und es ist das gleiche für alle Datenbank-Ebene meta-Daten in den einzelnen Datenbanken. Sie können einige Spalten-Namen wird groß-und Kleinschreibung, während andere groß-und Kleinschreibung unterschieden.
Auch, es ist nichts besonderes über die Tabellen-und Spaltennamen. Sie sind Datenbank-Ebene meta-Daten wie Benutzer-Namen, Schema-Namen, Index-Namen, etc. Alle diese meta-Daten gesteuert wird, die von der Datenbank die Standardsortierung.
Meta-Daten (Instanz-und Datenbankebene) ist nur "in der Regel" groß- /Kleinschreibung nicht durch die Standard-Sortierung vorgeschlagen, die während der installation wird eine case-insensitive Sortierung.
Ist es genauer, zu sagen, dass Sie einen begrenzten Bezeichner ist ein Bezeichner, eingeschlossen in was auch immer-Charakter(s) das DBMS in Frage, definiert hat als seine Trennzeichen. Und welche Zeichen verwendet werden für Trennzeichen variiert zwischen den verschiedenen DBMS.
Während eckigen Klammern immer die Arbeit als Trennzeichen für Bezeichner entsprechen, es ist möglich, verwenden Sie doppelte Anführungszeichen als Begrenzungszeichen verwendet werden, WENN Sie die session-level-Eigenschaft von
QUOTED_IDENTIFIER
eingestelltON
(am besten immer tun es trotzdem).Gut, delimited identifiers (begrenzte Bezeichner sind eigentlich ganz einfach. Der springende Punkt bei der Abgrenzung einer Kennung ist, um effektiv zu ignorieren die Regeln des regulären (d.h. nicht-getrennten) Bezeichnern. Aber, in Bezug auf die reguläre Bezeichner, ja, diese Regeln sind ziemlich geheimnisvoll (vor allem aufgrund der offiziellen Dokumentation unvollständig und falsch). So, um das Geheimnis aus, wie Bezeichner in der SQL Server eigentlich funktionieren, ich habe eine Reihe von Forschung und veröffentlicht die Ergebnisse hier (das gilt auch für links, die auf die Forschung selbst):
Vollständig Vollständige Liste der Regeln für den T-SQL-Bezeichner
Weitere Infos auf Sortierungen /Codierungen /Unicode /ASCII, zumal Sie beziehen sich auf Microsoft SQL Server besuchen Sie bitte:
Collations.Info
[]
als Zitate für begrenzte Bezeichner, unter anderen, entscheidende Unterschiede, und Standard-SQL - nicht erfordert groß-und Kleinschreibung im delimited identifiers (begrenzte Bezeichner).Sie könnte richtig sein, re: "Standard-SQL", aber das ist irrelevant für diese Frage, weil: a) diese Frage ist spezifisch für Microsoft SQL Server, und b) Sie fälschlicherweise diese "Standard-SQL" Regeln für SQL-Server, wo Sie eindeutig nicht gelten. In jedem Ihrer Kommentare auf die Frage Ihnen Zustand, oder bedeuten, dass der SQL-Server arbeitet nach dieser "Standard-SQL" - Regeln, und konzentrieren sich auf, ob oder nicht die Spalte die Namen wurden getrennt, als die Tabelle erstellt wurde, etc. Aber nichts von alledem ist hier anwendbar, und ist somit irreführend in diesem Zusammenhang. Das ist das, was ich am klären.
InformationsquelleAutor Solomon Rutzky
Überprüfen Sie die Sortierung der Spalten in der Tabellendefinition, und die Sortierung der Datenbank "tempdb" (D. H. die server-Sortierung). Sie können sich von Ihrem Datenbank-Sortierung.
siehe msdn.microsoft.com/en-us/library/ms175835.aspx
Anthony: es ist zwar richtig, dass es möglicherweise Unterschiede in den 3 Sortierungen, das hat nichts zu tun mit dem Problem, dass die O. P. ist. Die Frage ist nicht, mit den Daten im die Spalte, aber mit den Namen der Spalten sich, die Datenbank-Ebene meta-Daten. Gesteuert wird dies über die Datenbank die Standard-Sortierung, aber auch das ist irrelevant, wenn mit
SqlBulkCopy
. Bitte Lesen Sie meine Antwort für details.InformationsquelleAutor Anthony Faull
Die Tatsache, dass die Spalte die groß-und Kleinschreibung bedeutet, dass der MASTER-Datenbank erstellt wurde, mit einer Fall - /Kleinschreibung Sortierung.
In dem Fall, den ich gerade hatte, die mich führen, um dies zu untersuchen, jemand betrat
Latin1_CS_Aich statt Latin1_Cich_AS
Beim einrichten von SQL server.
master
Datenbank hat nichts damit zu tun, wie Spaltennamen (z.B. Datenbank-Ebene meta-Daten) behandelt werden, die außerhalb des Systems DBs (master
,model
,msdb
, undtempdb
). Nun, diemodel
DB dient als Vorlage für das erstellen der neuen DBs, aber die Sortierung von nicht-DBs-system kann einfach gewechselt werden. Es kann unterschiedlich eingestellt werden, indem Sie tunCREATE DATABASE {db_name} COLLATE {collation_name};
oder es kann später geändert werden überALTER DATABASE {db_name} COLLATE {new_collation_name};
. Bitte Lesen Sie meine Antwort für weitere details.InformationsquelleAutor Roger Willcocks