Pro ještě větší zábavu vyzkoušejte tento:
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
:)
Odpověď na váš dotaz je:"Historické důvody"
Datové typy INT a VARCHAR jsou starší než BIGINT a NVARCHAR. Hodně starší. Ve skutečnosti jsou v originálu Specifikace SQL. Starší je také přístup potlačující výjimky nahrazující výstup hvězdičkami.
Později se lidé z SQL rozhodli, že vyvolání chyby je lepší/konzistentnější atd. než nahrazování falešných (a obvykle matoucích) výstupních řetězců. Kvůli konzistenci si však zachovaly předchozí chování pro již existující kombinace datových typů (aby nedošlo k porušení stávajícího kódu).
Takže (mnohem) později, když byly přidány datové typy BIGINT a NVARCHAR, získaly nové chování, protože se na ně nevztahovalo výše uvedené zachování původního stavu.