2012-05-04 91 views
2

我有一個表,如下所示:從SQL Server中的XML,獲取下一個同級價值

CREATE TABLE CustomerXmlData 
(CustomerId int, 
CustomerData xml) 

在客戶鏈接到主客戶表和CustomerData是一個XML文檔,看起來像這樣

<Person> 
    <Product> 
    <Name>ABC</Name> 
    <Value>500</Value> 
    </Product> 
    <Product> 
    <Name>XYZ</Name> 
    <Value>600</Value> 
    </Product> 
</Person> 

有幾十萬這樣的行。在僞代碼中,我想要做的是「找到Product的平均值Value,其中Name ='XYZ'」。

我知道如何根據元素屬性或基於文檔中具有唯一的父項來獲取值,但在這種情況下這兩者都沒有任何用處。我找不到任何能讓我找到我想要的Name的東西,然後獲得下一個兄弟的價值。

我可以使用FOR XML並創建一個邊緣表,但是我需要通過光標來循環顯示嗎?我希望提供更有效的解決方案。

+1

如果它是SQL Server 2005中它(在其XML表格你)XQuery的支持,如果你知道一點的XPath也許可以是一個很好的起點。 http://msdn.microsoft.com/en-us/library/ms345122%28v=sql.90%29.aspx – BigMike

+1

我知道一些XPath ....現在我知道更多一點。非常感謝 –

回答

1

試試這個(編輯按名稱進行篩選):

DECLARE @Name VARCHAR(50) 
SET @Name = 'XYZ' 

SELECT Name, AVG(Value) 
FROM (
SELECT 
    c.value('Name[1]', 'VARCHAR(50)') AS Name 
    , c.value('Value[1]', 'DECIMAL') AS Value 
FROM CustomerXmlData 
CROSS APPLY CustomerData.nodes('//Product[Name = sql:variable("@Name")]') AS t(c) 
) T 
GROUP BY Name 
4

我找不到任何可以讓我找到我想要和 然後得到一個同級的值的名稱。

declare @Name varchar(10) 
set @Name = 'XYZ' 

select N.value('.', 'int') as Value  
from CustomerXmlData 
    cross apply CustomerData.nodes 
    ('/Person/Product[Name = sql:variable("@Name")]/Value') as T(N) 
+0

Upvoting爲正確的答案。我錯過了「WHERE Name ='XYZ'」位。編輯我的答案。 –