Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que converter/converter de int retorna um asterisco


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.