Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi cast/convert from int renvoie un astérisque

Pour encore plus de plaisir, essayez celui-ci :

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 réponse à votre question est :"Raisons historiques"

Les types de données INT et VARCHAR sont plus anciens que BIGINT et NVARCHAR. Beaucoup plus âgée. En fait, ils sont dans l'original Spécifications SQL. L'approche de suppression des exceptions consistant à remplacer la sortie par des astérisques est également plus ancienne.

Plus tard, les gens de SQL ont décidé que lancer une erreur était mieux/plus cohérent, etc. que de remplacer des chaînes de sortie fausses (et généralement déroutantes). Cependant, pour des raisons de cohérence, ils ont conservé le comportement précédent pour les combinaisons préexistantes de types de données (afin de ne pas casser le code existant).

Ainsi (beaucoup) plus tard, lorsque les types de données BIGINT et NVARCHAR ont été ajoutés, ils ont obtenu le (plus) nouveau comportement car ils n'étaient pas couverts par les droits acquis mentionnés ci-dessus.