2012-03-26 88 views
10

我有一個表RDCAlertsXML類型的列下面的數據稱爲AliasesValue從查詢XML列返回多個行SQL Server 2008中

<aliases> 
    <alias> 
    <aliasType>AKA</aliasType> 
    <aliasName>Pramod Singh</aliasName> 
    </alias> 
    <alias> 
    <aliasType>AKA</aliasType> 
    <aliasName>Bijoy Bora</aliasName> 
    </alias> 
</aliases> 

我想創建一個返回兩行的查詢 - 每個別名,我已經試過以下查詢:

SELECT 
    AliasesValue.query('data(/aliases/alias/aliasType)'), 
    AliasesValue.query('data(/aliases/alias/aliasName)'), 
FROM [RdcAlerts] 

但它返回只有一行是這樣的:

在聯機叢書

回答

15

看那.nodes()方法:

DECLARE @r TABLE (AliasesValue XML) 
INSERT INTO @r 
SELECT '<aliases> <alias>  <aliasType>AKA</aliasType>  <aliasName>Pramod Singh</aliasName> </alias> <alias>  <aliasType>AKA</aliasType>  <aliasName>Bijoy Bora</aliasName> </alias> </aliases> ' 


SELECT c.query('data(aliasType)'), c.query('data(aliasName)') 
FROM @r r CROSS APPLY AliasesValue.nodes('aliases/alias') x(c) 
+0

美!非常感謝,謝謝=) – 2012-03-26 13:47:48

+0

這是你寫回答後的5年......這只是幫助我解決了我遇到的問題。謝謝! – PKD 2017-08-15 15:49:18

+0

不客氣:) – 2017-08-16 16:42:33

12

您需要使用CROSS APPLY聲明與.nodes()功能一起獲得多行返回。

select 
    a.alias.value('(aliasType/text())[1]', 'varchar(20)') as 'aliasType', 
    a.alias.value('(aliasName/text())[1]', 'varchar(20)') as 'aliasName' 
from 
    RDCAlerts r 
    cross apply r.AliasesValue.nodes('/aliases/alias') a(alias) 
+0

歡呼,欣賞它;-) – 2012-03-26 13:56:42