SQL Server:有没有一种方法可以检查隐式转换的结果数据类型?

3

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

declare @i as int
set @i = 3
select @i  / 9.0 as returning_numeric
2个回答

3
表达式的结果是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)(可以从上面的查询中看到) @inumeric(10,0)(根据Mikael的答案
规则规定为什么numeric(10,0)/numeric(2,1)会给出numeric(17,6),请参见此处
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)">

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接