在SQL Server中将XML数据解析为行

b09cbbtk  于 2022-11-21  发布在  SQL Server
关注(0)|答案(1)|浏览(242)

我正在尝试从Elasticsearch结构解析我们的SQL Server中的WordPress数据。
这是一条记录上一个字段的内容;

<category domain="category" nicename="featured">Featured</category>
<category domain="post_tag" nicename="name1">Name 1</category>
<category domain="post_tag" nicename="name-2">Name 2</category>
<category domain="post_tag" nicename="different-name">Different Name</category>
<category domain="type" nicename="something-else">Something Else</category>

我想把它解析成一个表,其中包含标题Domain、NiceName和Contents,并且数据中的每个节点对应一行。
| 网域|很好Name|目录|
| - -|- -|- -|
| 范畴|特色|精选|
| 帖子标签|名称1|姓名1|
| 帖子标签|名称-2|姓名2|
| 帖子标签|异名|不同的名称|
| 类型|别的东西|其他|
数据中每一行的节点数是不同的,并且可以以任何顺序出现。当前数据以varchar数据类型存储,但如果最好使用XML之类的数据类型进行解析,则可以修改这种数据类型。

7d7tgy0s

7d7tgy0s1#

建议 您 使用 xml 数据 类型 来 存储 XML 数据 。 但是 , 如果 必须 将 其 存储 在 varchar 列 中 , 则 可以 使用 try_cast 将 其 转换 为 XML ( 如果 它 实际 上 不是 有效 的 XML , 则 会 生成 null ) , 然后 使用 常规 的 nodes()query()value() XML 方法 处理 它 , 如下 所 示 ...

create table dbo.Records (
  OneField varchar(max)
);
insert dbo.Records (OneField) values
  ('<category domain="category" nicename="featured">Featured</category>
<category domain="post_tag" nicename="name1">Name 1</category>
<category domain="post_tag" nicename="name-2">Name 2</category>
<category domain="post_tag" nicename="different-name">Different Name</category>
<category domain="type" nicename="something-else">Something Else</category>');

select
  Category.value('@domain', 'varchar(50)') as [Domain],
  Category.value('@nicename', 'varchar(50)') as [NiceName],
  Category.value('(text())[1]', 'varchar(50)') as [Contents]
from dbo.Records R
cross apply (select try_cast(OneField as XML)) X(OneFieldXML)
cross apply OneFieldXML.nodes('/category') N(Category);

中 的 每 一 个
| 网域|很 好 Name|目录|
| - -| - -| - -|
| 范畴|特色|精选|
| 帖子 标签|名称 1|姓名 1|
| 帖子 标签|名称 -2|姓名 2|
| 帖子 标签|异名|不同 的 名称|
| 类型|别 的 东西|其他|

相关问题