Это просто документированное поведение. Я не думаю, что кто-то напутал с настройками.
Смотрите приоритет данных типа на MSDN.
Когда оператор объединяет два выражения разных типов данных, правила для приоритета типа данных указывают, что тип данных с более низким приоритетом преобразуется в тип данных с более высоким приоритетом.
Как отмечено в комментариях, пустая строка преобразуется в 0 в любом числовом типе и в 1900-01-01 00: 00: 00.000 при преобразовании в дату.
РЕДАКТИРОВАТЬ: я думаю, что ваша реальная проблема заключается в том, что ваш дизайн так, что вы должны объединить в полях другого типа данных. Единственный способ обойти это - преобразование в предложении соединения, которое снизит производительность запросов. Основная проблема, вероятно, с дизайном схемы
РЕДАКТИРОВАТЬ: было много дискуссий в комментариях, которые были перемещены в чат. Как бы нелогично это ни казалось, преобразование пустой строки в другие типы данных приводит к произвольным значениям.
Этот код:
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
Производит этот вывод:
0
0
1900-01-01
1900-01-01 00:00:00.000
Тогда вы можете ожидать, что это поведение согласуется с другими предыдущими типами данных, и ожидать, что преобразование 0 в дату приведет к тому же произвольному значению, но это не так.
SELECT CONVERT(date, 0)
Производит
Явное преобразование из типа данных int в дату не допускается.
Потому что это не поддерживаемое преобразование
в то время как
SELECT CONVERT(datetime, 0)
Возвращает
01 января 1900 00:00:00
Так что да, это странно и произвольно, но на самом деле задокументировано и объяснимо.
CAST('' AS INT)
Задокументировано ли где-нибудь поведение -> 0? Было бы неплохо, если бы вы добавили ссылку.