如何 select 从可能格式不正确的 xml 节点作为 varchar?

How to select node from potentially not well-formed xml as a varchar?

我有不同的 'message' 列,它们是一个应该是 xml 的 varchar,但其中一些可能格式不正确或无效。我正在尝试清除具有给定输入值的节点的行,如下所示: Select * 来自消息日志,其中消息类似于“%1234567%”

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

我将每个条目都投射到 xml 将无法正常工作,因为大约 1% 的消息无效。

此代码不会将 varchar 解析为 xml,但 returns 一个子字符串(如果存在)。但是,我在 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.

您的 CASE 是 return 同时 VARCHARINT。您应该将 then 1 更改为 then '1',这样 CASE return 和 VARCHAR

的两个部分

我看到我可以 select 仅在存在现有 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>%'