我需要做什么才能容纳 Xml 文档中的传入值,这些值最终被写入为十进制(18,5)、整数或标签中可能没有数据的唯一标识符 [尽管不是 NULL 数据--正如我发现的困难方式],或标签中的文本数据。似乎我解决了一个问题,但又创建了另一个问题!:-\ 我收到错误消息:将 varchar 值“7800.00000”转换为数据类型 int 时转换失败,从字符串转换为唯一标识符时转换失败。我该如何纠正?
这是带有数据的 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)),
容纳非数字/非空值和我希望是小数的第一个非空值——如果我得到其他一些虚假值,它仍然可能会爆炸。关于如何处理的任何建议?