SQL Server: влияние сортировки столбцов на инструкции T-SQL

Я обнаружил (*) сегодня, что, в зависимости от сервера, мои команды TSQL были чувствительны к регистру, а это означает, что, когда один столбец таблицы имеет имя tableId, следующая инструкция может не выполниться:

SELECT TableId FROM myTable

В зависимости от сортировки столбца. SQL_Latin1_blablabla кажется нечувствительным к регистру, когда Latin1_blablabla есть.

Итак, мой первый вопрос: ПОЧЕМУ!!!

И второй: каков самый быстрый способ (sp?) изменить все параметры сортировки для всех соответствующих столбцов в базе данных?

РЕДАКТИРОВАТЬ: чтобы все было ясно:

SELECT tableId FROM myTable

Работа на всех серверах пока

SELECT TableId FROM myTable

Работает только на сервере с сортировкой SQL_Latin_blablabla. Обратите внимание на разницу между двумя строками. Мы говорим здесь не о сопоставлении данных, а о влиянии этого сопоставления на то, как мы пишем код!

(*) Я мог бы использовать здесь какое-то дополнительное и конкретное слово, чтобы описать мое душевное состояние после этого «открытия», но все они оцениваются взрослыми...


person Philippe Grondier    schedule 19.10.2009    source источник


Ответы (2)


В продолжение marc_s

sys.objects, sys.columns и т. д. хранят имена столбцов и имена объектов в сопоставлении базы данных. Итак, бинарная сортировка означает, что имена объектов рассматриваются как двоичные...

person gbn    schedule 19.10.2009

Это называется сопоставлением и определяет, будет ли SQL Server обрабатывать ваши строки как чувствительные к регистру и/или как чувствительные к диакритическим знакам (например, будет ли он распознавать è é à и т. д. или обрабатывать их так же, как e a и т. д.)

Это функция, а не ошибка!

Вы можете найти текущую сортировку с помощью этой команды:

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

Вы получите что-то вроде:

Latin1_General_CI_AS

«CI» означает: нечувствительный к регистру — CS означает «чувствительный к регистру».

«AS» означает: Чувствительность к акценту (и AI будет нечувствителен к акценту)

Вы можете определить стандартную сортировку для вашего SQL Server во время его установки, и вы можете переопределить ее для каждой создаваемой вами базы данных.

Вы также можете легко создавать таблицы и столбцы и указывать определенные параметры сортировки для каждого поля VARCHAR.

Чтобы изменить параметры сортировки для базы данных, вы можете использовать эту команду:

ALTER DATABASE MyDatabase COLLATE <desired collation>

К сожалению, существует множество причин, по которым эта команда может завершиться ошибкой... все, что "привязано к схеме", не позволит изменить параметры сортировки. В этом случае вы можете только удалить или отключить все эти «блокпосты», а затем повторить попытку — настоящее испытание!

Если вы выберете, например. «Latin1_General_CI_AS», у вас больше не должно быть регистрозависимых имен таблиц и столбцов.

Если вы хотите изменить сопоставление одного столбца в таблице данных, используйте эту команду:

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

Марк

person marc_s    schedule 19.10.2009
comment
Однако сопоставление таблицы не должно влиять на доступ к ее столбцам. - person Joey; 19.10.2009
comment
ну ... я много работал с данными на французском, румынском и арабском языках, поэтому я могу понять интерес к сопоставлению, когда речь идет о значениях, хранящихся в базе данных. Но почему это должно влиять на то, как я пишу код? - person Philippe Grondier; 19.10.2009