为什么从 sql_variant(基本类型十进制)的隐式转换对 float 不起作用

cro*_*sek 6 sql-server type-conversion cast sql-variant-property

为什么在下面的查询中 ResultFloat = 0?

我是否在cast/convertsql_variant文档中遗漏了一点?

declare
    @v sql_variant = convert(decimal(28,8), 20.0);

select sql_variant_property(@v, 'BaseType') as BaseType,         -- 'decimal',
       iif(convert(int, 10.0)     < @v, 1, 0) as ResultInt,      -- 1
       iif(convert(decimal, 10.0) < @v, 1, 0) as  ResultDecimal, -- 1
       iif(convert(float, 10.0)   < @v, 1, 0) as  ResultFloat,   -- 0 !
       iif(convert(float, 10.0)   < convert(float, @v), 1, 0) as  ResultFloatFloat,  -- 1              
       iif(convert(float, 10.0)   < convert(decimal(28,8), @v), 1, 0) as  ResultFloatDecimal;   -- 1
Run Code Online (Sandbox Code Playgroud)

数据库服务器 2012

Mik*_*son 7

来自sql_variant (Transact-SQL)

当比较不同基础数据类型的sql_variant值,并且基础数据类型在不同的数据类型族中时,层次图中数据类型族较高的值被认为是两个值中较大的值。

的基本数据类型系列@v是精确数值,基本数据类型系列convert(float, 10.0)是近似数值。

在层次结构图中,近似数值比精确数值更高,因此当您比较两个 sql_variant 值时,其中一个是近似数值,另一个是精确数值,近似数值将始终被视为更大。

完整的层次结构顺序是

+---------------------+-----+
| 数据类型族 | 会员 |
+---------------------+-----+
| sql_variant | sql_variant |
+---------------------+-----+
| 日期和时间 | 日期时间2 |
| | 日期时间偏移|
| | 日期时间 |
| | 小日期时间 |
| | 日期 |
| | 时间 |
+---------------------+-----+
| 近似数字 | 浮动|
| | 真实|
+---------------------+-----+
| 精确数字 | 十进制|
| | 钱|
| | 小钱|
| | bigint |
| | 国际|
| | 小号 |
| | 微小的|
| | 位|
+---------------------+-----+
| 统一码 | nvarchar |
| | nchar |
| | 变量 |
| | 字符 |
+---------------------+-----+
| 二进制 | varbinary |
| | 二进制 |
+---------------------+-----+
| 唯一标识符 | 唯一标识符 |
+---------------------+-----+