如何 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 同时 VARCHAR
和 INT
。您应该将 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>%'
我有不同的 '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 同时 VARCHAR
和 INT
。您应该将 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>%'