Untuk lebih menyenangkan, coba yang ini:
DECLARE @i INT
SET @i = 100
SELECT CAST(@i AS VARCHAR(2)) -- result: '*'
go
DECLARE @i INT
SET @i = 100
SELECT CAST(@i AS NVARCHAR(2)) -- result: Arithmetic overflow error
:)
Jawaban atas pertanyaan Anda adalah:"Alasan historis"
Tipe data INT dan VARCHAR lebih tua dari BIGINT dan NVARCHAR. Banyak lebih tua. Bahkan mereka dalam asli spesifikasi SQL. Yang juga lebih tua adalah pendekatan penekan pengecualian untuk mengganti output dengan tanda bintang.
Kemudian, orang-orang SQL memutuskan bahwa melempar kesalahan lebih baik/lebih konsisten, dll. daripada mengganti string keluaran palsu (dan biasanya membingungkan). Namun demi konsistensi, mereka mempertahankan perilaku sebelumnya untuk kombinasi tipe data yang sudah ada sebelumnya (agar tidak merusak kode yang ada).
Jadi (banyak) kemudian ketika tipe data BIGINT dan NVARCHAR ditambahkan, mereka mendapatkan perilaku baru karena tidak tercakup oleh pengecualian yang disebutkan di atas.