Если вы установили SQL Server с параметрами сортировки по умолчанию, вы можете обнаружить, что следующие запросы возвращают одинаковые результаты:
CREATE TABLE mytable
(
mycolumn VARCHAR(10)
)
GO
SET NOCOUNT ON
INSERT mytable VALUES('Case')
GO
SELECT mycolumn FROM mytable WHERE mycolumn='Case'
SELECT mycolumn FROM mytable WHERE mycolumn='caSE'
SELECT mycolumn FROM mytable WHERE mycolumn='case'
Вы можете изменить запрос, применив сопоставление на уровне столбца:
SELECT myColumn FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS = 'caSE'
SELECT myColumn FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS = 'case'
SELECT myColumn FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS = 'Case'
-- if myColumn has an index, you will likely benefit by adding
-- AND myColumn = 'case'
SELECT DATABASEPROPERTYEX('<database name>', 'Collation')
Поскольку изменение этого параметра может повлиять на приложения и запросы SQL, я бы сначала изолировал этот тест. Начиная с SQL Server 2000, вы можете легко выполнить инструкцию ALTER TABLE, чтобы изменить порядок сортировки определенного столбца, заставив его учитывать регистр символов. Сначала выполните следующий запрос, чтобы определить, на что вам нужно изменить его обратно:
EXEC sp_help 'mytable'
Второй набор записей должен содержать следующую информацию в сценарии по умолчанию:
Column_Name Collation
mycolumn SQL_Latin1_General_CP1_CI_AS
Независимо от того, что возвращает столбец «Сопоставление», теперь вы знаете, на что нужно его изменить, после внесения следующего изменения, которое приведет к чувствительности к регистру:
ALTER TABLE mytable
ALTER COLUMN mycolumn VARCHAR(10)
COLLATE Latin1_General_CS_AS
GO
SELECT mycolumn FROM mytable WHERE mycolumn='Case'
SELECT mycolumn FROM mytable WHERE mycolumn='caSE'
SELECT mycolumn FROM mytable WHERE mycolumn='case'
Если это все испортило, вы можете изменить его обратно, просто выполнив новую инструкцию ALTER TABLE (обязательно замените мой идентификатор COLLATE на тот, который вы нашли ранее):
ALTER TABLE mytable
ALTER COLUMN mycolumn VARCHAR(10)
COLLATE SQL_Latin1_General_CP1_CI_AS
Если вы застряли с SQL Server 7.0, вы можете попробовать этот обходной путь, который может быть немного большим ударом по производительности (вы должны получить результат только для ПЕРВОГО совпадения):
SELECT mycolumn FROM mytable WHERE
mycolumn = 'case' AND
CAST(mycolumn AS VARBINARY(10)) = CAST('Case' AS VARBINARY(10))
SELECT mycolumn FROM mytable WHERE
mycolumn = 'case' AND
CAST(mycolumn AS VARBINARY(10)) = CAST('caSE' AS VARBINARY(10))
SELECT mycolumn FROM mytable WHERE
mycolumn = 'case' AND
CAST(mycolumn AS VARBINARY(10)) = CAST('case' AS VARBINARY(10))
-- if myColumn has an index, you will likely benefit by adding
-- AND myColumn = 'case'