我在 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 不会在意。
谢谢