Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
合并SQL语句和匹配的记录转换_Sql_Sql Server_Merge - Fatal编程技术网

合并SQL语句和匹配的记录转换

合并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

我在SQL Server looks中的查询尝试只合并已更改的记录,而不是更新每一条记录,因此我在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语句。当我取消注释第二行并使用它时,它不能正常工作。它会说记录不同,并运行相应的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)

你知道,我想我在寻找答案的时候,刚好从那张图表上翻了过去。我知道为什么要找演员,但我无法证明。谢谢