我需要做些什么以适应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