我有以下表结构:
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)
但是,它似乎只是为了显示XML和XMLField的整个XML。
另外,我试过这个:
SELECT sp.Key,
x.XmlCol.Query('ForeignKey[text]')
FROM SpecialTable AS sp
CROSS APPLY sp.XMLField.nodes('/RootNode') x(XmlCol)
我只获得第一个ForeignKey节点中的第一个值而不是其他节点。
我做错了什么?
最诚挚的问候,
QuietLeni
答案 0 :(得分:1)
首先 - 如果您的数据看起来像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
数据类型,那么仅会有效(无论如何它应该是真的)