从sql数据库中的xml列返回所有节点的列表

时间:2014-03-14 23:02:42

标签: sql sql-server xml

我正在研究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不是一个有效的列名...如果我想先通过某些标签对其进行排序,是否有任何想法?

2 个答案:

答案 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)')