Bu sadece belgelenmiş davranış. Kimsenin ayarlarla uğraştığını sanmıyorum.
MSDN'deki veri türü önceliğine bakın .
Bir işleç farklı veri türlerinin iki ifadesini birleştirdiğinde, veri türü önceliği kuralları, düşük önceliğe sahip veri türünün daha yüksek önceliğe sahip veri türüne dönüştürüleceğini belirtir.
Yorumlarda belirtildiği gibi, boş dize herhangi bir sayısal türde 0'a ve bir tarihe dönüştürüldüğünde 1900-01-01 00: 00: 00.000'e dönüştürülür.
EDIT: Asıl probleminizin tasarımınızın farklı bir veri tipindeki alanlara katılmak zorunda olmanızdan kaynaklandığını düşünüyorum. Bunu aşmanın tek yolu, birleştirme yan tümcesinde sorgu performansına zarar verecek bir dönüşüme sahip olmak. Asıl sorun muhtemelen şema tasarımındadır.
EDIT: Sohbete taşınan yorumlarda çok fazla tartışma yapıldı. Ancak mantıksız görünebilir, boş bir dizgiyi diğer veri türlerine dönüştürmek keyfi değerler üretir.
Bu kod:
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
Bu çıktıyı üretir:
0
0
1900-01-01
1900-01-01 00:00:00.000
Daha sonra bu davranışın önceki diğer veri türleri arasında tutarlı olduğunu ve 0'ı tarihe dönüştürmenin aynı keyfi değeri üretmesini beklediğini ancak beklemiyor olabilirsiniz.
SELECT CONVERT(date, 0)
üretir
İnt türünden tarihe kadar açıkça dönüştürmeye izin verilmez.
Çünkü bu, desteklenen bir dönüşüm değil
süre
SELECT CONVERT(datetime, 0)
İade
Ocak, 01 1900 00:00:00
Yani evet, garip ve keyfi, ama aslında belgelenmiş ve açıklanabilir.