Sql-Server

為什麼從 sql_variant(基本類型十進制)的隱式轉換不能很好地與浮點數一起使用

  • January 14, 2014

為什麼 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

數據庫伺服器 2012

sql_variant (Transact-SQL)

當比較不同基礎數據類型的sql_variant值,並且基礎數據類型屬於不同的數據類型族時,層次圖中數據類型族較高的值被認為是兩個值中的較大者。

基本數據類型系列@v是精確數值,基本數據類型系列convert(float, 10.0)是近似數值。

近似數值在層次結構圖中高於精確數值,因此當您比較兩個 sql_variant 值時,其中一個是近似數值,另一個是精確數值,近似數值總是被認為更大。

完整的層次順序是

+---------------------+------------------+
| 數據類型族 | 會員 |
+---------------------+------------------+
| sql_variant | sql_variant |
+---------------------+------------------+
| 日期和時間 | 日期時間2 |
| | 日期時間偏移 |
| | 日期時間 |
| | 小日期時間 |
| | 日期 |
| | 時間 |
+---------------------+------------------+
| 近似數字 | 浮動 |
| | 真實 |
+---------------------+------------------+
| 精確數字 | 十進制 |
| | 錢|
| | 小錢|
| | 大整數 |
| | 整數 |
| | 小號 |
| | 小號 |
| | 位 |
+---------------------+------------------+
| 統一碼 | nvarchar |
| | nchar |
| | 變數 |
, , 字元 |
+---------------------+------------------+
| 二進制 | 變數二進制 |
| | 二進制 |
+---------------------+------------------+
| 唯一標識符 | 唯一標識符 |
+---------------------+------------------+

引用自:https://dba.stackexchange.com/questions/56722