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

Sql 如何从可能格式不好的xml中选择节点作为varchar?,sql,xml,xml-parsing,nvarchar,Sql,Xml,Xml Parsing,Nvarchar,我有不同的“message”列,它是一个varchar,应该是一个xml,但其中一些可能格式不好或无效。我正在尝试删除具有给定节点输入值的行,如下所示: 从messagelog中选择*,其中包含类似“%1234567%”的消息 但是,当我过滤这些节点以尝试提升另一个节点1234567的值时,我遇到了这个问题 我已经将每个条目强制转换为xml不会起作用,因为大约1%的消息无效 此代码不会将varchar解析为xml,但如果存在子字符串,则返回子字符串。但是,我在charindex=0的情况下得到了

我有不同的“message”列,它是一个varchar,应该是一个xml,但其中一些可能格式不好或无效。我正在尝试删除具有给定节点输入值的行,如下所示: 从messagelog中选择*,其中包含类似“%1234567%”的消息

但是,当我过滤这些节点以尝试提升另一个节点1234567的值时,我遇到了这个问题

我已经将每个条目强制转换为xml不会起作用,因为大约1%的消息无效

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

这里有我遗漏的东西吗?我是否支持使用SQL解析格式不正确的XML变量

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.

您的案例同时返回VARCHAR和INT。您应该将then 1更改为then“1”,以便案例的两部分都返回VARCHAR

您的案例同时返回VARCHAR和INT。您应该将then 1更改为then“1”,以便案例的两部分都返回VARCHAR

我发现我只能在位置选择子字符串存在现有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>%'

我发现我只能在存在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>%'