Para ficar ainda mais divertido, experimente este:
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
:)
A resposta à sua pergunta é:"Motivos históricos"
Os tipos de dados INT e VARCHAR são mais antigos que BIGINT e NVARCHAR. Muito Mais velho. Na verdade, eles estão no original Especificações SQL. Também mais antiga é a abordagem de supressão de exceção de substituir a saída por asteriscos.
Mais tarde, o pessoal do SQL decidiu que lançar um erro era melhor/mais consistente, etc., do que substituir strings de saída falsas (e geralmente confusas). No entanto, por uma questão de consistência, eles mantiveram o comportamento anterior para as combinações pré-existentes de tipos de dados (para não quebrar o código existente).
Então (muito) mais tarde, quando os tipos de dados BIGINT e NVARCHAR foram adicionados, eles obtiveram o comportamento new(er) porque não foram cobertos pela propriedade mencionada acima.