sql >> データベース >  >> RDS >> Sqlserver

intからのキャスト/変換がアスタリスクを返す理由

    さらに楽しくするには、これを試してください:

    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データ型が追加されたとき、それらは上記の祖父によってカバーされていなかったため、新しい(より)動作を取得しました。



    1. SQL Server(T-SQL)でのFORMAT()関数のしくみ

    2. sarの防衛(およびそれを構成する方法)

    3. MicrosoftAccessクエリで計算フィールドを作成する方法

    4. Oracle:同じ行の異なる列から最大値を選択します