我需要做些什麼以適應Xml文檔中最終被寫爲十進制(18,5),int或唯一標識符(可能沒有數據)的傳入值標籤[雖然不是NULL數據 - 因爲我發現硬的方式],或標籤中的文本數據。看來我解決了一個問題,但創建了另一個問題!: - \我得到的錯誤:將轉換varchar值'7800.00000'爲數據類型int 時轉換失敗,轉換失敗時從字符串轉換爲uniqueidentifier。我該如何糾正?tsql:xml節點轉換錯誤
下面是XML片段的未來與數據的示例:
<Products>
<Product>
<AgreementId>2439</AgreementId>
<Difference>0.00400</Difference>
<DispatchedQuantity>7800.00000</DispatchedQuantity>
<Freight>0.01560</Freight>
<ProductGUID>d475165c-0031-41f6-ad44-cecb73dfd2de</ProductGUID>
<ShortName>U_B5Not Specif_No2_U</ShortName>
</Product>
</Products
這裏的處理它在存儲的過程的代碼:
SELECT
l.OrderId,
l.OrderLiftId,
cast(n.x.value('AgreementId[1]', 'varchar(20)') as int),
CAST(CASE WHEN n.x.value('Difference[1]', 'varchar(20)') = '' THEN 0 ELSE COALESCE(n.x.value('Difference[1]', 'varchar(20)'), '0.00') END AS decimal(18,5)),
CAST(CASE WHEN n.x.value('DispatchedQuantity[1]', 'varchar(20)') = '' THEN 0 ELSE COALESCE(n.x.value('DispatchedQuantity[1]', 'varchar(20)'), '0.00') END AS decimal(18,5)),
CAST(CASE WHEN n.x.value('Freight[1]', 'varchar(20)') = '' THEN 0 ELSE COALESCE(n.x.value('Freight[1]', 'varchar(20)'), '0.00') END AS decimal(18,5)),
cast(n.x.value('ProductGUID[1]', 'varchar(40)') as uniqueidentifier),
n.x.value('ShortName[1]', 'varchar(100)')
FROM @lines as l
CROSS APPLY l.lineprods.nodes('/Products/Product') as n(x);
UPDATE:該線 -
CAST(CASE WHEN n.x.value('DispatchedQuantity[1]', 'varchar(20)') = '' THEN 0 ELSE COALESCE(n.x.value('DispatchedQuantity[1]', 'varchar(20)'), '0.00') END AS decimal(18,5)),
需要更改爲:
CAST(CASE WHEN n.x.value('DispatchedQuantity[1]', 'varchar(20)') = '' THEN 0 ELSE COALESCE(n.x.value('DispatchedQuantity[1]', 'decimal(18,5)'), '0.00') END AS decimal(18,5)),
,以適應非數字/非空值和第一個非空的,我希望是一個小數 - 如果我得到一些其他的做作值仍可能爆破。有關如何處理這個問題的任何建議?
謝謝!數字測試不起作用。現在,唯一標識符有什麼問題?該唯一標識符與此不兼容:從字符串轉換爲uniqueidentifier時轉換失敗...雖然不總是如此!: - \ – plditallo
非常感謝您使用GUID糾正此問題。我確實回去編輯我的原始SELECT與十進制轉換上的額外varchar。第一篇文章只是一個糟糕的剪貼工作。 – plditallo