0

我正在尝试使用其中包含货币值的现有列,并使用它们在另一列中设置一个值,该值是小数。例如,如果我的货币价值为“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))
4

3 回答 3

1

如果您的 abc_PaidDecimal 包含 NULL,您可以获得此行为。NULL 不能与任何其他值进行比较,它们唯一有效的比较是使用 IS NULL 或 IS NOT NULL。

所以,尝试添加or abc_PaidDecimal IS NULL到你的WHERE条款

于 2012-09-07T02:44:08.847 回答
0

8.65 和 8.6500000000000 是同一个数字。

1 和 00001 也是相同的数字。因此,在您的where子句中,<>将始终给出false. 这就是为什么你不更新任何东西

如果要使用此转换更新所有字段,请删除Where子句

于 2012-09-07T02:34:59.457 回答
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'
于 2012-09-07T02:54:59.977 回答