0

我在 SQL Server 中的查询看起来试图仅合并已更改的记录,而不是更新每一条记录,因此我在 MATCHED 子句之后插入了一个简单的 AND 语句,它工作得很好,除了一件事。在 C# 中,我了解您可能必须如何将变量转换为不同的类型才能比较它们,但我在 SQL 中“假设”并非如此。源列是数字 (19,5),目标列是小数 (18,4)。出于我们的目的,我不担心数据被截断,最终我会改变目标,所以它会持有更多,即(20,6)

这是声明:

WHEN MATCHED 
AND (((ISNULL(source.WorkOrderItemNumber,'') != ISNULL(target.WorkOrderItemNumber,'')) 
OR (ISNULL(CAST(source.WorkOrderQty as DECIMAL(18,4)),0) != ISNULL(target.WorkOrderQty,0)

-- ISNULL(source.WorkOrderQty,0) != ISNULL(target.WorkOrderQty,0)

) 

OR (ISNULL(source.WorkOrderBatchQty,0) != ISNULL(target.WorkOrderBatchQty,0)

))) 

当我运行上述语句时,它会做正确的事情并且不运行相应的更新语句。当我取消注释第二行并使用它时,它不能正常工作。它会说记录不同并运行相应的 UPDATE 语句。

工作正常,WorkOrderBatchQty但不同之处在于我0.00000 AS WorkOrderBatchQty在语句中硬编码,目标目标是十进制 (18,4)

我可以看到它为什么起作用,但我不明白为什么它不能双向起作用?我不认为 SQL 在比较值时使用这种方式进行转换。我猜 14.00000 与 14.0000 不同,但我认为 SQL 不会在意。

谢谢

4

1 回答 1

1

根据 MSDN 类型转换表,十进制和数字转换(r) 需要显式 CAST 以防止在隐式转换中可能发生的精度或小数位数丢失。寻找图表中的大星号。

所以你确实需要一个内联类型转换,比如:

ISNULL(CAST(source.WorkOrderQty AS DECIMAL(18, 4)), 0) != ISNULL(target.WorkOrderQty, 0)
于 2013-05-30T19:46:01.560 回答