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





Вам нужно будет изменить параметры сортировки базы данных. Вам также потребуется изменить параметры сортировки на уровне таблицы и столбца. Я верю, что вы можете найти там сценарий, если погуглите.
На самом деле вам не нужно изменять сопоставление для всей базы данных, если вы объявляете его в таблице или столбцах, которые должны быть чувствительны к регистру. Фактически, вы можете добавлять его к отдельным операциям по мере необходимости.
SELECT name WHERE 'greg' = name COLLATE Latin1_GENERAL_CS_AS
Я знаю, вы сказали, что хотите, чтобы это применялось ко всей базе данных. Но я упоминаю об этом, потому что в некоторых размещенных средах вы не можете управлять этим свойством, которое устанавливается при создании базы данных.
Ах, спасибо за подсказку. Я адаптировал эту строку из сценария, который использую ... но я исправлю образец.
Как насчет:
ALTER DATABASE database_name COLLATE collation_name
См. BOL для список параметров сортировки и выберите чувствительный к регистру тот, который лучше всего соответствует вашим потребностям (то есть тот, который использует ваш клиент). Очевидно, что, вероятно, будет хорошей идеей сделать полную резервную копию вашей базы данных, прежде чем вы попробуете это сделать. Я никогда лично не пробовал использовать базу данных с сопоставлением, отличным от сопоставления по умолчанию на сервере, поэтому я не знаю ни о каких «подводных камнях». Но если у вас есть хорошие резервные копии и вы протестируете их в своей среде перед развертыванием на своем клиенте, я не могу себе представить, что это связано с большим риском.
Если у вас есть БД, которая имеет другую сортировку по сравнению с экземпляром по умолчанию, вы можете столкнуться с проблемами, когда попытаетесь объединить свои таблицы с временными. Временные таблицы должны соответствовать экземпляру (поскольку они являются системными объектами), поэтому вам нужно использовать предложение COLLATE database_default в ваших соединениях.
select temp.A, table.B
from #TEMPORARY_TABLE temp inner join table
on temp.X COLLATE database_default = table.Y
Это заставляет сопоставление temp.X (в этом примере) сопоставлению текущей базы данных.
но не применяйте LOWER () к столбцу, иначе он не сможет использовать индекс ...