Esse é apenas um comportamento documentado. Eu não acho que alguém mexeu com as configurações.
Veja a precedência do tipo de dados no MSDN.
Quando um operador combina duas expressões de tipos de dados diferentes, as regras para a precedência do tipo de dados especificam que o tipo de dados com a precedência mais baixa é convertido no tipo de dados com a precedência mais alta.
Conforme observado nos comentários, a cadeia vazia é convertida em 0 em qualquer tipo numérico e em 1900-01-01 00: 00: 00.000 quando convertida em uma data.
Edição: Eu acho que seu problema real é que seu design é para que você tenha que ingressar em campos de um tipo de dados diferente. A única maneira de contornar isso é fazer uma conversão na cláusula de junção, o que prejudicará o desempenho da consulta. O principal problema provavelmente está no design do esquema
EDIT: Houve muita discussão nos comentários que foram movidos para o bate-papo. Por mais ilógico que possa parecer, a conversão de uma string vazia em outros tipos de dados produz valores arbitrários.
Este código:
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
Produz esta saída:
0
0
1900-01-01
1900-01-01 00:00:00.000
Você pode esperar que esse comportamento seja consistente entre outros tipos de dados anteriores e que a conversão de 0 em uma data produza o mesmo valor arbitrário, mas isso não ocorre.
SELECT CONVERT(date, 0)
Produz
A conversão explícita do tipo de dados int até a data não é permitida.
Porque não é uma conversão suportada
enquanto
SELECT CONVERT(datetime, 0)
Devoluções
01 de janeiro de 1900 00:00:00
Então, sim, é estranho e arbitrário, mas na verdade documentado e explicável.
CAST('' AS INT)
-> 0 está documentado em algum lugar? Seria bom se você adicionar referência.