SQL-使用货币设置十进制值

SQL-使用货币设置十进制值,sql,Sql,我试图获取一个包含货币值的现有列,并使用这些值在另一列中设置一个十进制值。例如,如果我将“8.65”作为货币值,我将尝试将与该记录关联的十进制值/列设置为“8.650000000”。在我的例子中,我需要10个小数点的精度 这是我尝试过的代码,但没有执行任何操作(它没有给出错误,只是没有更新任何记录): 设置abc\u PaidDecimal=CAST(abc\u PaidAmnt为十进制(16,10)) 其中abc_paidecimal CAST(abc_PaidAmnt为十进制(16,10))

我试图获取一个包含货币值的现有列,并使用这些值在另一列中设置一个十进制值。例如,如果我将“8.65”作为货币值,我将尝试将与该记录关联的十进制值/列设置为“8.650000000”。在我的例子中,我需要10个小数点的精度

这是我尝试过的代码,但没有执行任何操作(它没有给出错误,只是没有更新任何记录):

设置abc\u PaidDecimal=CAST(abc\u PaidAmnt为十进制(16,10))
其中abc_paidecimal CAST(abc_PaidAmnt为十进制(16,10))

8.65和8.650000000000是相同的数字

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


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

如果abc\u paidCIMAL包含NULL,则可以获得此行为。NULL不能与任何其他值进行比较,唯一有效的比较是使用is NULL或is NOT NULL


因此,尝试将
或abc\u PaidDecimal IS NULL
添加到您的
WHERE
子句中您不需要显式地将货币转换为十进制,它将被隐式转换 并存储为十进制(16,10)

然而,要在8.65和8.650000之间进行比较,请将两侧铸造到varchar(26) 当你不希望他们被平等对待时

WHERE   CAST(abc_PaidDecimal AS VARCHAR(26)) <> CAST(abc_PaidAmnt AS VARCHAR(26))

删除该子句确实允许执行我的查询,因此这是一个重要的问题。但是,在我的特定情况下,我的查询需要where子句。然后,您必须指定正确的where子句。你想什么时候更新?你的where子句永远不会更新任何内容。我不得不以我在原始问题中没有指定的方式更改where子句。然而,尽管所有的评论在某种程度上都是有用的,但这个答案正是引导我走上我所需要的道路的答案。
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'