Я использовал функцию MIN для сравнения символьных данных в столбце, который допускал null, с катастрофическими результатами. ;-) Вот очень упрощенный пример, который показывает такую же вещь:Преобразует все в varbinary правильный способ сравнения символьных данных?
Определить количество строк в таблице sys.indexes:
select count(*) from sys.indexes;
Выполнить этот SQL:
select count(name), substring(cast(min(name) as varbinary),1,1) from sys.indexes;
Если счетчик совпадений №1, остановитесь здесь. Попробуйте использовать другую базу данных (с большим количеством объектов).
Перейдите на вкладку «Сообщения». Вы должны увидеть: Предупреждение: значение Null исключается агрегатом или другой операцией SET.
Как бы вы обрабатывали нули в столбце «имя», чтобы устранить это предупреждение? с коалесцированием?
Заменить "имя" с "сливаются (имя, полукокса (0x7E))" и запустить SQL:
select count(coalesce(name,char(0x7e))), substring(cast(min(coalesce(name,char(0x7e))) as varbinary),1,1) from sys.indexes;
Примечание результат функции MIN в # 5 (0x7E вместо 0x63) ,
Вопросы:
А. Является ли сливаться надлежащим образом обрабатывать предупреждения и отсутствующие данные (нуль) за № 4?
B. Поскольку результат в # 6 не является тем, что ожидается, каков правильный способ сравнения символьных данных в SQL Server? Преобразовать все в varbinary?
[Отредактировано ...]
В нижеприведенных дискуссии, существует некоторая путаница и дискуссии о взаимосвязи между нулевой заменой через COALESCE и результаты сравнений. Связь между ними заключается в следующем: когда вы выбираете строку (включая один символ) в качестве замещающего нулевую замену (шаги №4 и №5 выше), эта строка должна удовлетворять ожидаемым результатам сравнения (сравнения), которые являются выполняется против значений других данных в запросе. При некоторых сопоставлениях поиск подходящей строки может быть сложнее, чем при других сопоставлениях.
Просто игнорируйте предупреждение. Это только информационное сообщение. Вы не должны использовать «varbinary» для сравнения символьных данных. –
Если вы игнорируете предупреждение, подсчеты отключены. Это то, что привлекло мое внимание, в первую очередь, в исходном коде, что довольно много связано. –
'COUNT (col)' только считает значения NOT NULL. Используйте 'COUNT (*)' для подсчета строк. Я не вижу, как это в какой-то мере связано с сопоставлением персональных данных, можете ли вы рассказать нам об исходном выпуске, который у вас был? –