我正在尝试使用包含货币值的现有列,并使用这些列在另一列中设置一个十进制值。例如,如果我将“8.65”作为我的货币值,我试图将与该记录相关联的十进制值/列设置为“8.6500000000”。就我而言,我需要10个小数点的精度。
这是我尝试的代码,它没有做任何事情(它没有给出错误,它只是没有更新任何记录):
SET abc_PaidDecimal = CAST(abc_PaidAmnt AS DECIMAL(16,10))
WHERE abc_PaidDecimal <> CAST(abc_PaidAmnt AS DECIMAL(16,10))
答案 0 :(得分:1)
如果abc_PaidDecimal包含NULL,则可以获得此行为。 NULL不能与任何其他值进行比较,唯一有效的比较是使用IS NULL或IS NOT NULL。
因此,请尝试将or abc_PaidDecimal IS NULL
添加到您的WHERE
子句
答案 1 :(得分:0)
8.65和8.6500000000000是相同的数字。
1和00001也是相同的数字。因此,在where
条款中,<>
将始终提供false
。这就是为什么你没有更新任何东西
如果要更新所有字段,请使用此转换删除Where
子句
答案 2 :(得分:0)
您无需将金钱明确地转换为十进制,它将被隐式转换 并存储为十进制(16,10)
然而要在8.65和8.650000之间进行比较,将两边都投射到varchar(26) 何时你不希望他们被平等对待。
WHERE CAST(abc_PaidDecimal AS VARCHAR(26)) <> CAST(abc_PaidAmnt AS VARCHAR(26))
一个例子
DECLARE @v1 MONEY = 23.25
,@v2 DECIMAL(18,6)= 23.250000
SELECT @v1 , @v2
IF @v1 = @v2
SELECT 'same value before cast'
ELSE
SELECT 'different value before cast'
SELECT CAST(@v1 AS VARCHAR(26)) , CAST(@v2 AS VARCHAR(26))
IF CAST(@v1 AS VARCHAR(26)) = CAST(@v2 AS VARCHAR(26))
SELECT 'same value after cast'
ELSE
SELECT 'different value after cast'