För ännu roligare, prova den här:
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
:)
Svaret på din fråga är:"Historiska skäl"
Datatyperna INT och VARCHAR är äldre än BIGINT och NVARCHAR. Mycket äldre. Faktum är att de är i originalet SQL-specifikationer. Äldre är också det undantagsundertryckande tillvägagångssättet att ersätta utdata med asterisker.
Senare bestämde SQL-folket att det var bättre/mer konsekvent att kasta ett fel, etc. än att ersätta falska (och vanligtvis förvirrande) utdatasträngar. Men för konsekvensens skull behöll de det tidigare beteendet för de redan existerande kombinationerna av datatyper (för att inte bryta befintlig kod).
Så (mycket) senare när BIGINT- och NVARCHAR-datatyperna lades till, fick de det nya(re) beteendet eftersom de inte omfattades av den farfar som nämns ovan.