2013-05-30 48 views
0

我在SQL Server外觀中的查詢試圖合併只更改記錄,而不是更新每一個記錄,所以我在MATCHED子句之後插入一個簡單的AND語句,除了一件事物。在C#中,我明白你可能必須將變量轉換爲不同類型以便比較它們,但我在SQL中「假設」不是這種情況。源列是數字(19,5),目標是十進制(18,4)。對於我們而言,我並不擔心數據的截斷,最終我將改變目標所以它的將舉行更多即(20,6)合併SQL語句和匹配的記錄轉換

這裏的語句:

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會在意。

由於

回答

1

按照MSDN類型轉換圖表,十進制和數值轉換(r)equires explicit CAST to prevent the loss of precision or scale that might occur in an implicit conversion。在圖表中尋找大星號。

所以你需要一個內嵌的類型轉換,如:

ISNULL(CAST(source.WorkOrderQty AS DECIMAL(18, 4)), 0) != ISNULL(target.WorkOrderQty, 0) 
+0

你知道,我認爲我滾動對了那個圖的時候我一直在尋找的答案。我知道爲什麼它要求CAST我無法證明它。謝謝! –