Для этого я изучил под управлением ЛАТЕКСНЫЕ приложения для генерации PDF. Хотя эта опция, вероятно, будет намного более сложной и мощной, чем те перечисленные здесь.
Сопоставление можно установить на различных уровнях:
Таким образом, у вас может быть столбец с учетом регистра в базе данных без учета регистра. Я еще не сталкивался с ситуацией, когда можно было бы создать экономическое обоснование для чувствительности к регистру для одного столбца данных, но я полагаю, что это могло бы быть.
Проверка сопоставления сервера
SELECT SERVERPROPERTY('COLLATION')
Проверка сопоставления базы данных
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
Проверка сопоставления столбцов
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
Если вы установили 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'
Вы можете изменить свой запрос, установив сопоставление в столбце level:
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
Каким бы ни был ' Возвращает столбец Collation, теперь вы знаете, на что вам нужно вернуться после того, как вы сделаете следующее изменение, которое вызовет чувствительность к регистру:
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'
Вы заинтересованы в сопоставлении. Вы можете создать что-нибудь на основе этого фрагмента:
SELECT DATABASEPROPERTYEX('master', 'Collation');
Обновление
На основе вашего редактирования - если @test
и @TEST
могут когда-либо ссылаться на две разные переменные, это не SQL Сервер. Если вы видите проблемы, когда та же переменная не равна самой себе, проверьте, является ли эта переменная NULL
, потому что NULL = NULL
возвращает «false».
SQL Server не чувствителен к регистру. SELECT * FROM SomeTable
совпадает с SeLeCT * FROM soMetaBLe
.