Sql-Server
為什麼從 sql_variant(基本類型十進制)的隱式轉換不能很好地與浮點數一起使用
為什麼 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
數據庫伺服器 2012
當比較不同基礎數據類型的sql_variant值,並且基礎數據類型屬於不同的數據類型族時,層次圖中數據類型族較高的值被認為是兩個值中的較大者。
基本數據類型系列
@v
是精確數值,基本數據類型系列convert(float, 10.0)
是近似數值。近似數值在層次結構圖中高於精確數值,因此當您比較兩個 sql_variant 值時,其中一個是近似數值,另一個是精確數值,近似數值總是被認為更大。
完整的層次順序是
+---------------------+------------------+ | 數據類型族 | 會員 | +---------------------+------------------+ | sql_variant | sql_variant | +---------------------+------------------+ | 日期和時間 | 日期時間2 | | | 日期時間偏移 | | | 日期時間 | | | 小日期時間 | | | 日期 | | | 時間 | +---------------------+------------------+ | 近似數字 | 浮動 | | | 真實 | +---------------------+------------------+ | 精確數字 | 十進制 | | | 錢| | | 小錢| | | 大整數 | | | 整數 | | | 小號 | | | 小號 | | | 位 | +---------------------+------------------+ | 統一碼 | nvarchar | | | nchar | | | 變數 | , , 字元 | +---------------------+------------------+ | 二進制 | 變數二進制 | | | 二進制 | +---------------------+------------------+ | 唯一標識符 | 唯一標識符 | +---------------------+------------------+