【问题标题】:SQL Server: data type "rank" in arithmetic operations?SQL Server:算术运算中的数据类型“等级”?
【发布时间】:2011-07-31 22:39:27
【问题描述】:

当将两个不同数据类型的值放在一起进行算术运算时,SQL Server 会自动将值转换为某种数据类型。例如

DECLARE @d NUMERIC(9,6);
SET @d = 1.0;
SELECT @d/3;
GO

结果 0.33333333。这种转换背后的内在逻辑是什么?数据类型之间是否存在某种“等级”(转换将发生在哪个“方向”上)?

【问题讨论】:

    标签: sql sql-server sql-server-2005 sql-server-2008 types


    【解决方案1】:

    请参阅:Data Type Precedence (for SQL-Server 2000)@msdn.microsoft.com

    来自SQL-Server 2008的同一页面:

    当一个运算符将两个 不同数据类型的表达式, 数据类型优先规则 指定数据类型与 较低的优先级转换为 具有较高优先级的数据类型。

    如果转换不是支持隐式转换,则返回错误。当两个操作数表达式具有相同的数据时 类型,运算结果有 该数据类型。

    SQL Server 使用以下 数据类型的优先顺序:

    1. 用户定义的数据类型(最高
    2. sql_variant
    3. xml
    4. 日期时间偏移
    5. 日期时间2
    6. 日期时间
    7. 小日期时间
    8. 日期
    9. 时间
    10. 浮动
    11. 真实
    12. 十进制
    13. 小钱
    14. 大整数
    15. int
    16. smallint
    17. 小号
    18. 文本
    19. 文字
    20. 图片
    21. 时间戳
    22. 唯一标识符
    23. nvarchar(包括 nvarchar(max) )
    24. nchar
    25. varchar(包括 varchar(max) )
    26. 字符
    27. varbinary(包括 varbinary(max) )
    28. 二进制(最低

    有关两个操作数何时为 char、varchar、binary 或 varbinary 表达式并且它们被连接或比较以及何时它们都是具有不同精度或小数位数的小数时的各种详细信息,请参阅:Precision, Scale, and Length

    以下 SO 问题/答案也相关:sql-server-truncates-decimal-points-of-a-newly-created-field-in-a-view

    【讨论】:

    【解决方案2】:

    由于分子和分母都是整数,所以结果将是整数。您需要将两者之一转换为十进制值:

    Select @i / 3.0
    

    Data Type Conversion (Database Engine)

    CAST and CONVERT (Transact-SQL)

    具体来说,请注意有关隐式数据类型转换的部分。在您的示例中,由于所有类型都属于同一类型,因此没有转换。虽然 Cast/Convert 文章介绍了这些函数,但它也概述了隐式转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      相关资源
      最近更新 更多