cro*_*sek 6 sql-server type-conversion cast sql-variant-property
为什么在下面的查询中 ResultFloat = 0?
我是否在cast/convert、sql_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
当比较不同基础数据类型的sql_variant值,并且基础数据类型在不同的数据类型族中时,层次图中数据类型族较高的值被认为是两个值中较大的值。
的基本数据类型系列@v
是精确数值,基本数据类型系列convert(float, 10.0)
是近似数值。
在层次结构图中,近似数值比精确数值更高,因此当您比较两个 sql_variant 值时,其中一个是近似数值,另一个是精确数值,近似数值将始终被视为更大。
完整的层次结构顺序是
+---------------------+-----+ | 数据类型族 | 会员 | +---------------------+-----+ | sql_variant | sql_variant | +---------------------+-----+ | 日期和时间 | 日期时间2 | | | 日期时间偏移| | | 日期时间 | | | 小日期时间 | | | 日期 | | | 时间 | +---------------------+-----+ | 近似数字 | 浮动| | | 真实| +---------------------+-----+ | 精确数字 | 十进制| | | 钱| | | 小钱| | | bigint | | | 国际| | | 小号 | | | 微小的| | | 位| +---------------------+-----+ | 统一码 | nvarchar | | | nchar | | | 变量 | | | 字符 | +---------------------+-----+ | 二进制 | varbinary | | | 二进制 | +---------------------+-----+ | 唯一标识符 | 唯一标识符 | +---------------------+-----+
归档时间: |
|
查看次数: |
4678 次 |
最近记录: |