【问题标题】:SQL Server: Is there a way to check what is the resulting data type of implicit conversion?SQL Server:有没有办法检查隐式转换的结果数据类型是什么?
【发布时间】:2011-08-02 04:15:22
【问题描述】:

有没有办法检查隐式转换的结果数据类型是什么?还是我只需要根据加入算术运算的数据类型来知道它?

declare @i as int
set @i = 3
select @i  / 9.0 as returning_numeric

【问题讨论】:

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


    【解决方案1】:

    表达式的结果是numeric (17,6)。看到这个

    DECLARE @i  INT, @v SQL_VARIANT
    
    SET @i = 3
    SET @v = @i  / 9.0
    
    SELECT
        CAST(SQL_VARIANT_PROPERTY(@v, 'BaseType') AS VARCHAR(30)) AS BaseType,
        CAST(SQL_VARIANT_PROPERTY(@v, 'Precision') AS INT) AS Precision,
        CAST(SQL_VARIANT_PROPERTY(@v, 'Scale') AS INT) AS Scale
    

    返回

    BaseType   Precision   Scale
    ---------- ----------- -----------
    numeric    17          6
    

    编辑:

    SELECT SQL_VARIANT_PROPERTY(9.0, 'BaseType'),
           SQL_VARIANT_PROPERTY(9.0, 'Precision'),
           SQL_VARIANT_PROPERTY(9.0, 'Scale')
    

    所以文字9.0被视为numeric(2,1)(可以从上面的查询中看出)

    @i 是 numeric(10,0)(根据 Mikael's answer)

    管理为什么numeric(10,0)/numeric(2,1) 给出numeric (17,6) are covered here 的规则

    Operation:        e1 / e2
    Result precision: p1 - s1 + s2 + max(6, s1 + p2 + 1)
    Result scale:     max(6, s1 + p2 + 1)
    

    用给定的相关值替换

    10 - 0 + 1 + max(6, 0 + 2 + 1)  = 17
    max(6, 0 + 2 + 1)               =  6 
    

    【讨论】:

      【解决方案2】:

      这里完成的隐式转换是在 @i 到 numeric(10,0)。您可以修改您的语句并查看执行计划。

      declare @i int
      
      set @i = 3
      select @i  / 9.0
      from (select 1) as x(x)
      

      从执行计划中提取

      <ScalarOperator ScalarString="CONVERT_IMPLICIT(numeric(10,0),[@i],0)/(9.0)">
      

      但是,结果数据类型是 numeric(17,6),正如 Martin 在他的回答中显示的那样,而执行计划中没有显示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        • 2013-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多