合并SQL语句和匹配的记录转换
我在SQL Server looks中的查询尝试只合并已更改的记录,而不是更新每一条记录,因此我在MATCHED子句后插入了一个简单的AND语句,除了一件事之外,它工作正常。在C#中,我了解如何将变量强制转换为不同的类型以进行比较,但在SQL中我“假设”情况并非如此。源列是数字(19,5),目标列是十进制(18,4)。出于我们的目的,我不担心数据的截断,最终我会改变目标,使其能够容纳更多数据,即(20,6) 声明如下:合并SQL语句和匹配的记录转换,sql,sql-server,merge,Sql,Sql Server,Merge,我在SQL Server looks中的查询尝试只合并已更改的记录,而不是更新每一条记录,因此我在MATCHED子句后插入了一个简单的AND语句,除了一件事之外,它工作正常。在C#中,我了解如何将变量强制转换为不同的类型以进行比较,但在SQL中我“假设”情况并非如此。源列是数字(19,5),目标列是十进制(18,4)。出于我们的目的,我不担心数据的截断,最终我会改变目标,使其能够容纳更多数据,即(20,6) 声明如下: WHEN MATCHED AND (((ISNULL(source.Wor
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语句。当我取消注释第二行并使用它时,它不能正常工作。它会说记录不同,并运行相应的UPDATE语句
WorkOrderBatchQty
工作正常,但不同之处在于我将0.00000硬编码为WorkOrderBatchQty
,并将其写入语句中,目标目标为十进制(18,4)
我知道它为什么有效,但我不明白它为什么不能双向工作?我不认为SQL在比较值时使用了这种方式。我猜14.00000与14.0000不同,但我认为SQL不会在意
谢谢根据MSDN类型转换图,十进制和数字转换。在图表中寻找大星号 因此,您确实需要一个内联类型转换,如:
ISNULL(CAST(source.WorkOrderQty AS DECIMAL(18, 4)), 0) != ISNULL(target.WorkOrderQty, 0)
你知道,我想我在寻找答案的时候,刚好从那张图表上翻了过去。我知道为什么要找演员,但我无法证明。谢谢