2016-01-14 94 views
0

我正在使用SQL Server 2014,我需要帮助构建一个查询,该查询将为我提供特定XML节点的所有值。我有一个表格,它以xml格式存储信息。 xml数据如下:使用SQL获取XML节点值

<category> 
    <text>Laser Printers</text> 
    <title id="1"> 
     <text>HP OfficeJet Pro 8610</text> 
    </text> 
    <title id="2"> 
     <text>HP OfficeJet Pro 8700</text> 
    </text> 
    <title id="3"> 
     <text>Canon PIXMA MX 922</text> 
    </text>  
</category> 

我只能从第一个节点获取表中每一行的值,使用此查询。

SELECT it.contents.value('(category/title/text)[1]', 'NVARCHAR(255)') as Printer 
FROM inventory i 
INNER JOIN store_products p ON i.inventoryId = p.inventoryId 
INNER JOIN items it ON p.itemId = it.itemId 

所以我的结果是:

Printer 
HP OfficeJet Pro 8610 

我需要的是以下几点:

Printer 
HP OfficeJet Pro 8610, HP OfficeJet Pro 8700, Canon PIXMA MX 922 

这甚至可能吗?

+0

你的XML是无效的 - 在''节点应该各有一个''终端节点 - 不是''。 ... –

回答

1

您需要使用CROSS APPLY.nodes() XQuery函数 - 是这样的:

SELECT 
    XC.value('(text)[1]', 'varchar(100)') AS Printer 
FROM 
    inventory i 
INNER JOIN 
    store_products p ON i.inventoryId = p.inventoryId 
INNER JOIN 
    items it ON p.itemId = it.itemId 
CROSS APPLY 
    it.contents.nodes('/category/title') AS XT(XC) 
+0

谢谢!还有一个问题,我有另一个名为'Store#'的列,它作为第一列包含在查询中。对不起,我忘了补充一点。我怎样才能得到按该栏分组的结果? – user721126

+0

你输入的速度比我做得快:-)投票给它...... – Shnugo

+0

@ user721126:只有在你的选择列表中有**集合应用于他们的列时,分组才有意义 - COUNT,MIN/MAX','AVG'等。也许你的意思是*排序*(排序)?当然,这不是问题 - 只需在末尾添加ORDER BY StoreNumber –