【发布时间】:2013-05-30 19:18:57
【问题描述】:
我在 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 不会在意。
谢谢
【问题讨论】:
标签: sql sql-server merge