如何将 XML 数组拆分为单独的行(同时保持一致性)

Che*_*ain 6 xml sql-server xquery string-splitting sql-server-2017

我正在处理这个确切的堆栈交换部分的数据库转储。在我处理它的过程中,我遇到了一个我目前无法解决的问题。

在 XML 文件 Posts.xml 中,内容如下所示

在此处输入图片说明

当然有多行,但这就是一个的样子。转储中已经提供了一个 Tags.xml 文件,这使得该图片中的“Tags”属性实际上应该是它的单独表(多对多)变得更加明显。

所以现在我正试图找出一种如何提取标签的方法。这是我尝试做的:

CREATE TABLE #TestingIdea (
Id int PRIMARY KEY IDENTITY (1,1),
PostId int NULL,
Tag nvarchar (MAX) NULL
)
GO
Run Code Online (Sandbox Code Playgroud)

? 我创建的表来测试我的代码。我已经用标签和 PostIds 填充了它

SELECT  T1.PostId,
        S.SplitTag
FROM (
    SELECT  T.PostId, 
            cast('<X>'+ REPLACE(T.Tag,'>','</X><X>') + '</X>' as XML) AS NewTag
    FROM #TestingIdea AS T
    ) AS T1
CROSS APPLY (
    SELECT tData.value('.','nvarchar(30)') SplitTag
    FROM T1.NewTag.nodes('X') AS T(tData)
    ) AS S
GO
Run Code Online (Sandbox Code Playgroud)

然而此代码返回此错误

XML parsing: line 1, character 37, illegal qualified name character
Run Code Online (Sandbox Code Playgroud)

在谷歌搜索这个错误之后(包括这里),无论人们有什么(比如额外的“标记或不同的字符集)我都没有。所以我有点卡住了。也许我错过了之前答案中非常明显的一些我发现 T_T 无论如何我感谢有关如何解决此问题的任何帮助和建议。这是我尚未标准化的最后一张表。

来自 XML 文件的小样本数据 https://pastebin.com/AW0Z8Be2 对于任何对我用来查看 XML 文件的程序感兴趣的人(因此像上面的图片一样更容易阅读)。它被称为 FOXE XML Reader(免费 XML 编辑器 - 第一个对象)

Ran*_*gen 8

这样的事情是否满足结果集?

表格和数据

CREATE TABLE #TestingIdea (
Id int PRIMARY KEY IDENTITY (1,1),
PostId int NULL,
Tag nvarchar (MAX) NULL
)

INSERT INTO #TestingIdea(PostId,Tag)
VALUES(1,'<mysql><innodb><myisam>')

GO
Run Code Online (Sandbox Code Playgroud)

询问

SELECT PostId, RIGHT(value,len(value)-1) as SplitTag
FROM #TestingIdea 
CROSS APPLY string_split(tag,'>')
WHERE value != ''
Run Code Online (Sandbox Code Playgroud)

结果

PostId  SplitTag
1   mysql
1   innodb
1   myisam
Run Code Online (Sandbox Code Playgroud)