Це лише документально підтверджена поведінка. Я не думаю, що хтось заплутався з налаштуваннями.
Дивіться пріоритет типу даних на MSDN.
Коли оператор поєднує два вирази різних типів даних, правила для пріоритету типу даних визначають, що тип даних із нижчим пріоритетом перетворюється на тип даних з більш високим пріоритетом.
Як зазначається в коментарях, порожній рядок перетворюється на 0 в будь-якому числовому типі і в 1900-01-01 00: 00: 00.000 при перетворенні на дату.
EDIT: Я думаю, що ваша реальна проблема полягає в тому, що ваша конструкція така, що вам доведеться приєднуватися до полів іншого типу даних. Єдиний спосіб подолати це - зробити конверсію на приєднаному пункті, що пошкодить продуктивність запитів. Основна проблема, мабуть, у дизайні схеми
EDIT: У коментарях, які були переміщені до чату, було багато дискусій. Як би нелогічно це не здавалося, перетворення порожнього рядка в інші типи даних створює довільні значення.
Цей код:
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
Так, так, це дивно і довільно, але насправді задокументовано і пояснюється.