2016-01-14 119 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 –