さらに楽しくするには、これを試してください:
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
:)
あなたの質問に対する答えは「歴史的な理由」
です。データ型INTおよびVARCHARは、BIGINTおよびNVARCHARよりも古いものです。 多く 古い。実際、彼らはオリジナルにいます SQL仕様。また、出力をアスタリスクに置き換える例外抑制アプローチも古いものです。
その後、SQLの人々は、偽の(そして通常は混乱する)出力文字列を置き換えるよりも、エラーをスローする方が優れている/一貫性が高いなどと判断しました。ただし、一貫性を保つために、既存のデータ型の組み合わせに対する以前の動作を保持しました(既存のコードを壊さないようにするため)。
したがって、(ずっと)後でBIGINTおよびNVARCHARデータ型が追加されたとき、それらは上記の祖父によってカバーされていなかったため、新しい(より)動作を取得しました。