我正在处理这个确切的堆栈交换部分的数据库转储。在我工作期间,我遇到了一个我目前无法解决的问题。
在XML Posts.xml中,内容如下所示

当然有多行,但这就是其中之一。转储中已经给出了一个Tags.xml文件,这使得图片中的“标记”属性实际上应该是它的独立表(多到多)更加明显。
所以现在我想找出一种如何提取标签的方法。以下是我想做的事:
CREATE TABLE #TestingIdea (
Id int PRIMARY KEY IDENTITY (1,1),
PostId int NULL,
Tag nvarchar (MAX) NULL
)
GO↑是我为测试代码而创建的表。我已经用标签和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然而,此代码返回此错误。
XML parsing: line 1, character 37, illegal qualified name character在谷歌上搜索了这个错误(包括这里)之后,无论人们拥有什么(比如额外的“分数”或不同的查集),我都没有。所以我有点被困住了。也许我错过了以前的答案中非常明显的一些东西--我在任何情况下都发现了T_T --我很感谢关于如何解决这个问题的任何帮助和建议。这是我最后一张还没有正常化的表格。
来自XML的小样本数据,对于任何对我用来查看https://pastebin.com/AW0Z8Be2文件的程序感兴趣的人来说都是如此(因此,像上面的图片一样,阅读起来要容易得多)。它被称为FOXE XML阅读器(免费的XML编辑器-第一个对象)
发布于 2018-12-15 19:42:19
这样的东西能满足结果集吗?
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>')
GOSELECT PostId, RIGHT(value,len(value)-1) as SplitTag
FROM #TestingIdea
CROSS APPLY string_split(tag,'>')
WHERE value != ''PostId SplitTag
1 mysql
1 innodb
1 myisamhttps://dba.stackexchange.com/questions/225067
复制相似问题