Itu hanya perilaku yang terdokumentasi. Saya tidak berpikir ada yang mengacaukan pengaturan.
Lihat prioritas tipe data pada MSDN.
Ketika seorang operator menggabungkan dua ekspresi dari tipe data yang berbeda, aturan untuk presedensi tipe data menentukan bahwa tipe data dengan prioritas lebih rendah dikonversi ke tipe data dengan prioritas lebih tinggi.
Seperti yang tercantum dalam komentar, string kosong akan dikonversi ke 0 dalam jenis numerik apa pun dan ke 1900-01-01 00: 00: 00.000 saat dikonversi ke tanggal.
EDIT: Saya pikir masalah Anda sebenarnya adalah desain Anda sehingga Anda harus bergabung di bidang tipe data yang berbeda. Satu-satunya cara untuk mengatasi ini adalah dengan memiliki konversi pada klausa bergabung Anda yang akan merusak kinerja kueri. Masalah utama mungkin dengan desain skema
EDIT: Ada banyak diskusi di komentar yang telah dipindahkan ke obrolan. Betapapun tidak logisnya, mengonversi string kosong ke tipe data lain menghasilkan nilai arbitrer.
Kode ini:
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
Menghasilkan output ini:
0
0
1900-01-01
1900-01-01 00:00:00.000
Anda bisa berharap kemudian bahwa perilaku ini konsisten antara tipe data sebelumnya dan berharap bahwa mengubah 0 ke tanggal akan menghasilkan nilai arbitrer yang sama tetapi tidak.
SELECT CONVERT(date, 0)
Menghasilkan
Konversi eksplisit dari tipe data ke tanggal tidak dibolehkan.
Karena itu bukan konversi yang didukung
sementara
SELECT CONVERT(datetime, 0)
Kembali
1 Januari 1900 00:00:00
Jadi ya, ini aneh dan sewenang-wenang, tetapi sebenarnya didokumentasikan dan dijelaskan.
CAST('' AS INT)
-> 0 didokumentasikan di suatu tempat? Akan lebih baik jika Anda menambahkan referensi.