我正在研究SQL数据库,我需要一种方法来返回附有标签的所有产品的列表。这是我的xml的快速示例
<ArrayOfString>
<string>fee</string>
<string>activation</string>
</ArrayOfString>
我还有一个ProductType和ProductID列。我需要做的是提取某个产品类型的所有条目,并列出xml列中的不同字符串。所以我需要看到的是像......
------------------------------------------------
PRODUCTID | TAG | PRODUCT TYPE
------------------------------------------------
1 | fee | 1
1 | activation | 1
2 | fee | 1
3 | fee | 1
所以基本上如果该列中的xml有超过1个'字符串'节点,我需要知道EACH节点及其附带的productID。
我尝试使用Tags.values()和Tags.query()来获取我的值,并且我可以尽可能多地返回像...返回值...
------------------------------------------------
PRODUCTID | TAG | PRODUCT TYPE
------------------------------------------------
1 | <string>fee</st| 1
2 | fee | 1
3 | fee | 1
但是这会将所有字符串整合在一个视图中......
此外,我试图解决这个问题,因为我可以做到这一点,并试图说出
SELECT ProductID, Tags.query('/ArrayOfString/string') AS AttachedTags
FROM dbo.products
WHERE ProductType = 1
ORDER BY AttachedTags
但是它说AttachedTags不是一个有效的列名...如果我想先通过某些标签对其进行排序,是否有任何想法?
答案 0 :(得分:3)
为了分解具有相同名称的多个节点,您需要使用CROSS APPLY:
SELECT ProductID, ProductTags.Tag.value('.', 'nvarchar(MAX)') AS AttachedTag
FROM dbo.products
CROSS APPLY Tags.nodes('/ArrayOfString/string/text()') as ProductTags(Tag)
WHERE ProductType = 1
ORDER BY AttachedTag
答案 1 :(得分:1)
您也可以使用
从YOUR_TABLE中选择YOUR_COLUMN.value(&#39;(YOUR_NODES)[1]&#39;,&#39; VARCHAR(100)&#39;)
喜欢
xml.value('(/form/NotesSection/Nt-Status)[1]','VARCHAR(100)')