Menurut dokumentasi Microsoft , untuk fungsi:
ISNULL(check_expression, replacement_value)
replacement_value harus dari tipe yang secara implisit dapat dikonversi ke tipe check_expression . Perhatikan bahwa ketik untuk 'xy'+NULL adalah VARCHAR(3) . Karena ini string Anda 'ABCDEFGHIJ' dilemparkan ke VARCHAR(3) dan dengan demikian dipangkas.
Kedengarannya aneh mengapa bukan VARCHAR(2) , tapi beginilah adanya - satu karakter lebih panjang dari 'xy' . Anda dapat bermain dengan SQLFiddle
ini dan lihat sendiri jenis itu untuk 'xy'+NULL sama dengan ekspresi CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END , yaitu NULL tetapi secara implisit kompatibel dengan VARCHAR(3) .
Tampaknya untuk ekspresi 'xy'+NULL panjang yang dirasakan dapat dihitung sebagai 'xy' panjang string (2) ditambah 1 untuk setiap NULL ditambahkan. Misalnya, ketik 'xy'+NULL+NULL adalah VARCHAR(4) , ketikkan 'xy'+NULL+NULL+NULL adalah VARCHAR(5) dan seterusnya - lihat SQLFiddle
ini . Ini sangat aneh, tapi begitulah cara kerja MS SQL Server 2008 dan 2012.