Per divertirti ancora di più, prova questo:
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
:)
La risposta alla tua domanda è:"Motivi storici"
I tipi di dati INT e VARCHAR sono più vecchi di BIGINT e NVARCHAR. Molto più vecchio. In effetti sono nell'originale Specifiche SQL. Anche più vecchio è l'approccio di soppressione delle eccezioni di sostituire l'output con asterischi.
Più tardi, la gente di SQL ha deciso che lanciare un errore era migliore/più coerente, ecc. rispetto alla sostituzione di stringhe di output fasulle (e solitamente confuse). Tuttavia, per motivi di coerenza, hanno mantenuto il comportamento precedente per le combinazioni preesistenti di tipi di dati (in modo da non violare il codice esistente).
Quindi (molto) più tardi, quando sono stati aggiunti i tipi di dati BIGINT e NVARCHAR, hanno ottenuto il nuovo comportamento perché non erano coperti dal nonno menzionato sopra.