我有不同的'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.
答案 0 :(得分:1)
您的CASE
同时返回VARCHAR
和INT
。您应该将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>%'