最終的にdecimal(18,5)、int、またはタグ内にデータがない可能性のある一意の識別子として書き込まれるXmlドキュメントの着信値に対応するために何をする必要がありますか[ただし、NULLデータではありません--難しい方法を見つけたので]、またはタグ内のテキストデータ。1つの問題を解決したようですが、別の問題を作成します!:-\エラーが発生します:varchar値「7800.00000」をデータ型intに変換すると変換に失敗し、文字列からuniqueidentifierに変換すると変換に失敗しました。これを修正するにはどうすればよいですか?
データに含まれる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);
更新:この行-
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)),
非数値/非ヌルおよび私が望む最初の非ヌルが小数であることに対応するために、他の趣味の値を取得した場合でも、爆発する可能性があります。それに対処する方法について何か提案はありますか?