如何使用 SQL 和 XQuery 获取根节点中所有节点的内容?
How do I get the contents of all of the nodes in a root node with SQL and XQuery?
我有以下 table 结构:
CREATE TABLE SpecialTable
(
Key UNIQUEIDENTIFIER,
XMLField VARCHAR(MAX)
)
在第一个元组中:
Key = "28384841-17283848-7836-18292939"
XMLField =
"<RootNode>
<ForeignKey>92383829-27374848-1298-19283789</ForeignKey>
<ForeignKey>47585853-27374848-4759-19283939</ForeignKey>
<ForeignKey>37383829-27374848-3747-19283930</ForeignKey>
</RootNode>"
在另一个元组中,我看到:
Key = "89984841-17283848-7836-18292939"
XMLField =
"<RootNode>
<ForeignKey>92383829-27374848-1298-19283789</ForeignKey>
<ForeignKey>37383829-27374848-3747-19283930</ForeignKey>
</RootNode>"
在另一个元组中,我看到:
Key = "11114841-17283848-7836-18292939"
XMLField =
"<RootNode>
<ForeignKey>37383829-27374848-3747-19283930</ForeignKey>
</RootNode>"
我需要做的是得到以下数据集:
Key ForeignKey
28384841-17283848-7836-18292939 92383829-27374848-1298-19283789
28384841-17283848-7836-18292939 47585853-27374848-4759-19283939
28384841-17283848-7836-18292939 37383829-27374848-3747-19283930
89984841-17283848-7836-18292939 92383829-27374848-1298-19283789
89984841-17283848-7836-18292939 37383829-27374848-3747-19283930
11114841-17283848-7836-18292939 37383829-27374848-3747-19283930
我必须说这是一个简化的数据集,而且数据比这更复杂,我已经到了无法进一步了解的地步。
我试过这个:
SELECT sp.Key,
x.XmlCol.Query('.')
FROM SpecialTable AS sp
CROSS APPLY sp.XMLField.nodes('/RootNode') x(XmlCol)
不过,似乎只是显示Key和XMLField的整个XML。
此外,我试过这个:
SELECT sp.Key,
x.XmlCol.Query('ForeignKey[text]')
FROM SpecialTable AS sp
CROSS APPLY sp.XMLField.nodes('/RootNode') x(XmlCol)
而且我只得到第一个 ForeignKey 节点中的第一个值,而不是其他节点。
我做错了什么?
最诚挚的问候,
安静的莱尼
首先 - 如果您的数据看起来像 XML,嘎嘎声像 XML,闻起来像 XML - 那么它 IS XML 你应该使用 XML
数据类型来存储它!
此外:请注意 Key
是一个非常通用的术语,也是一个 T-SQL 保留关键字 ,因此它确实是一个错误的列名称 - 使用不与关键字冲突的更有意义的名称!
完成后,您应该能够使用此代码获得所需的结果:
SELECT
[Key],
ForeignKey = xc.value('.', 'varchar(50)')
FROM
dbo.SpecialTable
CROSS APPLY
XMLField.nodes('/RootNode/ForeignKey') AS XT(XC)
如果您的列 XMLField
是 XML
数据类型,这将 仅 有效!! (无论如何它确实应该是)
我有以下 table 结构:
CREATE TABLE SpecialTable
(
Key UNIQUEIDENTIFIER,
XMLField VARCHAR(MAX)
)
在第一个元组中:
Key = "28384841-17283848-7836-18292939"
XMLField =
"<RootNode>
<ForeignKey>92383829-27374848-1298-19283789</ForeignKey>
<ForeignKey>47585853-27374848-4759-19283939</ForeignKey>
<ForeignKey>37383829-27374848-3747-19283930</ForeignKey>
</RootNode>"
在另一个元组中,我看到:
Key = "89984841-17283848-7836-18292939"
XMLField =
"<RootNode>
<ForeignKey>92383829-27374848-1298-19283789</ForeignKey>
<ForeignKey>37383829-27374848-3747-19283930</ForeignKey>
</RootNode>"
在另一个元组中,我看到:
Key = "11114841-17283848-7836-18292939"
XMLField =
"<RootNode>
<ForeignKey>37383829-27374848-3747-19283930</ForeignKey>
</RootNode>"
我需要做的是得到以下数据集:
Key ForeignKey
28384841-17283848-7836-18292939 92383829-27374848-1298-19283789
28384841-17283848-7836-18292939 47585853-27374848-4759-19283939
28384841-17283848-7836-18292939 37383829-27374848-3747-19283930
89984841-17283848-7836-18292939 92383829-27374848-1298-19283789
89984841-17283848-7836-18292939 37383829-27374848-3747-19283930
11114841-17283848-7836-18292939 37383829-27374848-3747-19283930
我必须说这是一个简化的数据集,而且数据比这更复杂,我已经到了无法进一步了解的地步。
我试过这个:
SELECT sp.Key,
x.XmlCol.Query('.')
FROM SpecialTable AS sp
CROSS APPLY sp.XMLField.nodes('/RootNode') x(XmlCol)
不过,似乎只是显示Key和XMLField的整个XML。
此外,我试过这个:
SELECT sp.Key,
x.XmlCol.Query('ForeignKey[text]')
FROM SpecialTable AS sp
CROSS APPLY sp.XMLField.nodes('/RootNode') x(XmlCol)
而且我只得到第一个 ForeignKey 节点中的第一个值,而不是其他节点。
我做错了什么?
最诚挚的问候,
安静的莱尼
首先 - 如果您的数据看起来像 XML,嘎嘎声像 XML,闻起来像 XML - 那么它 IS XML 你应该使用 XML
数据类型来存储它!
此外:请注意 Key
是一个非常通用的术语,也是一个 T-SQL 保留关键字 ,因此它确实是一个错误的列名称 - 使用不与关键字冲突的更有意义的名称!
完成后,您应该能够使用此代码获得所需的结果:
SELECT
[Key],
ForeignKey = xc.value('.', 'varchar(50)')
FROM
dbo.SpecialTable
CROSS APPLY
XMLField.nodes('/RootNode/ForeignKey') AS XT(XC)
如果您的列 XMLField
是 XML
数据类型,这将 仅 有效!! (无论如何它确实应该是)