БД, которую я использую, имеет сопоставление French_CI_AS (CI должен стоять за нечувствительным к регистру), но в любом случае чувствителен к регистру. Я пытаюсь понять, почему.
Причина, по которой я утверждаю это, заключается в том, что объемные вставки с установкой случая «GIVEN» терпят неудачу, но они преуспевают с другой установкой «заданный».
Например:
INSERT INTO SomeTable([GIVEN],[COLNAME]) VALUES ("value1", "value2")
не удается, но INSERT INTO SomeTable([Given],[ColName]) VALUES ("value1", "value2")
работает. EDIT Только что увидел это:
http://msdn.microsoft.com/en-us/library/ms190920.aspx
так что это означает, что можно было бы изменить сортировку столбцов, не опуская все данные и воссоздавая связанную таблицу?
Учитывая эту важную часть информации (то есть в комментарии по вопросу, а не в фактическом вопросе):
На самом деле я использую метод массовой вставки Microsoft .Net, поэтому я не знаю точно, какой именно запрос он отправляет на сервер БД.
имеет смысл, что имена столбцов обрабатываются как чувствительные к регистру, даже в нечувствительной к регистру БД, так как это SqlBulkCopy
класс SqlBulkCopy
. См. Сравнение столбцов в SqlBulkCopy чувствительны к регистру .
ДОПОЛНИТЕЛЬНЫЕ ЗАМЕЧАНИЯ
При задании вопроса, пожалуйста, не изменяйте обстоятельства, с которыми вы имеете дело. Например, вопрос формулируется (выделено мной):
объемные вставки с установкой случая «GIVEN» завершаются неудачно, но они преуспевают с другой установкой «Данный».
Тем не менее, примерные утверждения - это одиночные INSERT
. Кроме того, в комментарии к этому вопросу говорится:
На самом деле я использую метод массовой вставки Microsoft .Net, поэтому я не знаю точно, какой именно запрос он отправляет на сервер БД.
Использование .NET и SqlBulkCopy
не зависит от использования BULK INSERT
или INSERT
, что делает текущий вопрос обманчивым, что затрудняет (или даже невозможно) правильно ответить. Этот новый бит информации также SqlBulkCopy
больше вопросов, потому что при использовании SqlBulkCopy
вы не пишете никаких INSERT
: вы просто пишете SELECT
и указываете имя таблицы назначения. Если вы укажете имена столбцов вообще для таблицы назначения, это будет в необязательных сопоставлениях столбцов. Это где проблема?
Что касается раздела «EDIT» вопроса:
Нет, изменение Collation столбца вообще не поможет, даже если вы не использовали SqlBulkCopy
. Столбец столбца определяет, как ведут себя данные, хранящиеся в столбце , а не как ведут себя имена столбцов (т. Е. Метаданные таблицы). Именно сортировка самой базы данных определяет, как ведет себя метаданные объекта на уровне базы данных. И в этом случае вы утверждаете, что БД использует нечувствительную к регистру сортировку (правильно, _CI_
часть имени сортировки означает « C ase I nsensitive»).
Что касается следующих утверждений, сделанных Джонатаном Леффлером по вопросу:
который попадает в очень тонкую область взаимодействия между идентификаторами с разделителями (обычно с учетом регистра) и сопоставлениями (этот не учитывает регистр).
Нет, идентификаторы с разделителями обычно не чувствительны к регистру. Чувствительность (случай, акцент, тип kana, ширина и начало селектора вариаций SQL Server 2017) идентификаторов с разделителями те же, что и для идентификаторов без разделителей на том же уровне. «Тот же уровень» означает, что имена уровня экземпляра (базы данных, логины и т. Д.) Контролируются Collation экземпляра, тогда как имена уровня базы данных (схемы, объекты - таблицы, представления, функции, хранимые процедуры и т. Д.), Пользователи и т. Д.) Контролируются путем сортировки на уровне базы данных. И эти два уровня могут иметь разные Коллажи.
вам нужно исследовать, являются ли имена столбцов SQL в базе данных чувствительными к регистру при ограничении. Это также может зависеть от того, как написан оператор CREATE TABLE (были ли эти имена ограничены?). Обычно SQL не учитывает регистр для имен столбцов и таблиц; вы можете написать
INSERT INTO SoMeTaBlE(GiVeN, cOlNaMe) VALUES("v1", "v2")
и если имена никогда не были ограничены, все будет в порядке.
Не имеет значения, были ли имена столбцов ограничены или нет при создании таблицы, по крайней мере, не с точки зрения их разрешения. Имена столбцов представляют собой метаданные на уровне базы данных, и это контролируется по умолчанию для сортировки базы данных. И это одинаково для всех метаданных на уровне базы данных в каждой базе данных. Вы не можете иметь имена столбцов с учетом регистра, в то время как другие не учитывают регистр.
Кроме того, нет ничего особенного в именах таблиц и столбцов. Они представляют собой метаданные на уровне базы данных, такие же как имена пользователей, имена схем, имена индексов и т. Д. Все эти метаданные контролируются по умолчанию.
Метаданные (как на уровне экземпляра, так и на уровне базы данных) являются «нормально» без учета регистра из-за значения по умолчанию, предложенного во время установки, без учета регистра.
«идентификатор с разделителями» - это имя столбца, имя таблицы или что-то подобное, заключенное в двойные кавычки, например CREATE TABLE «table» (...)
Точнее сказать, что идентификатор с разделителями является идентификатором, заключенным в любой символ (ы), который рассматриваемая СУБД определила как ее разделители. И какие конкретные символы используются для разделителей, различаются между различными СУБД.
В SQL Server идентификаторы с разделителями заключены в квадратные скобки: [GIVEN]
Хотя квадратные скобки всегда работают как разделители для идентификаторов, можно использовать двойные кавычки как разделители, если у вас есть свойство уровня сеанса QUOTED_IDENTIFIER
установленное на ON
(что лучше всего всегда делать в любом случае).
Существуют тайные части для SQL (и одним из них является обработка с разделителями идентификаторов)
Ну, разграниченные идентификаторы на самом деле довольно просты. Весь смысл разграничения идентификатора - это эффективно игнорировать правила регулярных (т.е. недистримированных) идентификаторов. Но, с точки зрения регулярных идентификаторов, да, эти правила довольно загадочны (в основном из-за неполной и неправильной официальной документации). Итак, чтобы понять, как работают идентификаторы в SQL Server, я провел кучу исследований и опубликовал результаты здесь (в том числе ссылки на само исследование):
Для получения дополнительной информации о Collations / Encodings / Unicode / ASCII, особенно в том, что касается Microsoft SQL Server, посетите: