2009-10-19 2 views
3

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

SELECT TableId FROM myTable 

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

Так что мой первый вопрос - ПОЧЕМУ !!!

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

EDIT: сделать вещи очень ясно:

SELECT tableId FROM myTable 

Работа на всех серверах, а

SELECT TableId FROM myTable 

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

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

ответ

4

Вслед за marc_s

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

+0

Как только вы это сказали, это кажется очевидным ... –

5

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

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

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

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

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

Latin1_General_CI_AS 

"CI" означает: чувствительно к регистру - CS будет означать Case Sensitive

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

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

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

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

ALTER DATABASE MyDatabase COLLATE <desired collation> 

К сожалению, Есть много причин, почему эта команда может потерпеть неудачу .... ничего, что «схема-оценка» предотвратит изменение сортировки. В этом случае вы можете только сбросить или отключить все эти «дорожные блоки», а затем повторить попытку - довольно тяжелое испытание!

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

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

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

Марк

+1

Однако сопоставление таблицы не должно влиять на доступ к ее столбцам. – Joey

+0

хорошо ... Я много работал с французскими, румынскими и арабскими данными, поэтому я могу понять интерес сортировки, когда дело доходит до значений, хранящихся в базе данных. Но почему это должно повлиять на то, как я пишу код? –

Смежные вопросы