如何从可能不是格式良好的xml中选择节点作为varchar?

时间:2016-03-16 18:40:08

标签: sql xml xml-parsing nvarchar

我有不同的'message'列,这是一个varchar,应该是一个xml,但其中一些可能不是格式正确或有效。我试图将具有给定输入值的行清除到节点,如下所示: 从消息日志中选择*,其中包含'%1234567%'

等消息

但是,当我过滤那些试图提升另一个节点(1234567)而我不知道的价值时,我遇到了这个问题。

我将每个条目都转换为xml不会起作用,因为1%的消息无效。

此代码不会将varchar解析为xml,但会返回子字符串(如果存在)。但是,我在charindex = 0的情况下得到转换错误。一些MessageIds是这些大型varchars。

这里有什么我想念的吗?我是SOL,使用SQL来解析格式不正确的XML varchars吗?

select
case when CAST(charindex('<RelatesToMessageID>', message) as varchar(100)) = 0
then 1
else
substring(message, charindex('<RelatesToMessageID>', message)+20,     charindex('</RelatesToMessageID>', message)-charindex('<RelatesToMessageID>', message)-20)
end
from messagelog

Conversion failed when converting the varchar value '959B91D824324108948261EC2A81CD92' to data type int.

2 个答案:

答案 0 :(得分:1)

您的CASE同时返回VARCHARINT。您应该将then 1更改为then '1',以便CASE的两个部分都返回VARCHAR

答案 1 :(得分:1)

我看到我只能在存在NCPDPID的位置选择子字符串。这样可以完全摆脱这种情况。

if exists(Select * from messagelog where message like '%<NCPDPID>1234567</NCPDPID>%')

select substring(message, charindex('<MessageID>', message)+11, charindex('</MessageID>', message)-charindex('<MessageID>', message)-11) from messagelog where message like '%<NCPDPID>1234567</NCPDPID>%'