Eso es solo un comportamiento documentado. No creo que nadie haya tenido problemas con la configuración.
Vea la precedencia del tipo de datos en MSDN.
Cuando un operador combina dos expresiones de diferentes tipos de datos, las reglas para la precedencia del tipo de datos especifican que el tipo de datos con la precedencia más baja se convierte al tipo de datos con la precedencia más alta.
Como se señaló en los comentarios, la cadena vacía se convierte a 0 en cualquier tipo numérico y a 1900-01-01 00: 00: 00.000 cuando se convierte en una fecha.
EDITAR: Creo que su verdadero problema es que su diseño es para que tenga que unirse en campos de un tipo de datos diferente. La única forma de evitar esto es tener una conversión en su cláusula de unión que perjudicará el rendimiento de la consulta. El problema principal es probablemente con el diseño del esquema.
EDITAR: Hubo mucha discusión en los comentarios que se movieron al chat. Por ilógico que parezca, la conversión de una cadena vacía a otros tipos de datos produce valores arbitrarios.
Este código:
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
Produce esta salida:
0
0
1900-01-01
1900-01-01 00:00:00.000
Podría esperar que este comportamiento sea coherente entre otros tipos de datos anteriores y esperar que convertir 0 a una fecha produzca el mismo valor arbitrario pero no lo hace.
SELECT CONVERT(date, 0)
Produce
La conversión explícita del tipo de datos int a la fecha no está permitida.
Porque no es una conversión compatible
mientras
SELECT CONVERT(datetime, 0)
Devoluciones
01 de enero de 1900 00:00:00
Entonces sí, es extraño y arbitrario, pero en realidad está documentado y es explicable.
CAST('' AS INT)
-> 0 está documentado en alguna parte? Sería bueno si agrega una referencia.