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 编辑器 - 第一个对象)
这样的事情是否满足结果集?
表格和数据
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)
归档时间: |
|
查看次数: |
2431 次 |
最近记录: |