【发布时间】:2022-01-05 09:02:22
【问题描述】:
我在“输入”列中有 xml 格式的字符串数据,我需要从中获取特定的节点值。
举个例子:
我需要每个“错误 id”中的每个“error_text_1”值。
<error_protokoll>
<header>
<source>machine</source>
</header>
<error_list>
<error id='0'>
<error_text_1>error0</error_text_1>
</error>
<error id='1'>
<error_text_1>error1</error_text_1>
</error>
</error_list>
</error_protokoll>
以下 sql 语句仅返回 id=0 的“error_text_1”值。
SELECT top (10)
XML_INPUT.value('(error_protokoll/error_list/error/error_text_1)[1]', 'varchar(200)') error
FROM
(
convert(xml, SUBSTRING( REPLACE(INPUT, '{
"xml" : "<?xml version=''1.0''?>', ''), 0 , len(REPLACE(INPUT, '{
"xml" : "<?xml version=''1.0''?>', ''))-3)) as XML_INPUT
FROM [Storage].[ods].[table]
) a
我想要所有的,而不是只有第一项。
你能帮忙解决这个问题吗?
【问题讨论】:
-
看起来您有包含 XML 的 JSON,也许您应该使用
OPENJSON或JSON_VALUE来检索它。也不确定为什么要删除<?xml序言,它应该在那里。请提供一个minimal reproducible example,其中包含您需要转换的实际值 -
@Charlieface,我编辑了原始帖子以显示输入列中的原始单元格值。由于“{}”括号和“”xml”:“”我将文本转换为xml。
-
我已回滚该编辑,因为它使我现有的答案无效;社区对此表示严重不满。 Don't be a Chameleon.
-
看起来
CAST(JSON_VALUE(yourValue, '$.xml') AS xml)应该可以解决问题
标签: sql sql-server xml database