【发布时间】:2022-01-26 19:40:51
【问题描述】:
我试图理解为什么当我将值从 VARCHAR(MAX) 转换为 NUMERIC(P,S) 时,SQL Server 会修改我的比例值。
示例如下:
--declare @val1 as numeric (18,6)
--declare @val2 as numeric (18,6)
DECLARE @val1 AS VARCHAR(MAX)
DECLARE @val2 AS VARCHAR(MAX)
SET @val1 = '2383.4912500000'
SET @val2 = '2383.4912000000'
DROP TABLE IF EXISTS TMP
SELECT
V1 = @VAL1,
VC1 = CAST(@VAL1 AS NUMERIC(30, 20)),
valDiff = ABS(CAST(CAST(@VAL2 AS NUMERIC(18, 6)) - CAST(@VAL1 AS NUMERIC(18, 6)) AS NUMERIC(30, 20)) / @VAL1)
INTO
TMP
SELECT * FROM TMP
-- when variable is VARCHAR(MAX), valDiff == 0.00000002 which is correct, but rounded.
-- when the variable is NUMERIC(18, 6), valDiff == 0.0000000209776310275945 which is correct and not rounded
【问题讨论】:
-
您考虑过...不在
varchar(max)中存储数字吗? -
是的。这不是我的代码库。拥有此代码的团队不太了解他们的 SQL 能力。我最感兴趣的是了解 SQL Server 为何这样做。
-
valDiff的数据类型是decimal(38,8).. 0.00000002 :: 8个小数点
-
@lptr 我知道 SQL 创建的数据类型。问题是为什么它设置为 38,8?我将变量转换为 30,20?
-
@mdiprima .. 是的,分母 @val1[varchar] 隐式转换为分子的数字数据类型。第一个是 (30,20)/(30,20) — > (38,8) 第二个 (18,6)/(18,6)—>(38,20)
标签: sql sql-server sqldatatypes