2011-05-29 60 views
2

如何使用SQL XQuery連接所有元素的特定屬性?將所有元素的特定屬性連接到xquery

我有這樣的一個表:

InvoiceId Details 
--------- ----------------------------------------------------------------- 
1001  <Stuff Id="101" p="3" q="5"/><Stuff Id="102" q="4"/><Stuff Id="103"/> 
1002  <Stuff Id="201" /><Stuff Id="202" q="2"/> 

,需要這樣的結果=>

InvoiceId IdDetails 
--------- --------------------- 
1001  101,102,103 
1002  201,202 

回答

2
declare @T table(InvoiceId int, Details xml) 
insert into @T 
select 1001, '<Stuff Id="101" p="3" q="5"/><Stuff Id="102" q="4"/><Stuff Id="103"/>' union all 
select 1002, '<Stuff Id="201"/><Stuff Id="202" q="2"/>' 

select InvoiceId, 
     stuff((select ','+t.n.value('@Id', 'varchar(10)') 
       from Details.nodes('Stuff') as t(n) 
       for xml path('')), 1, 1, '') as IdDetails 
from @T 

Id唯一的值。

select InvoiceId, 
     stuff((select ','+s.id 
       from Details.nodes('Stuff') as t(n) 
       cross apply (select t.n.value('@Id', 'varchar(10)')) as s(id) 
       group by s.id 
       for xml path('')), 1, 1, '') as IdDetails 
from @T 
+0

很多很多,謝謝。現在,我們如何區分IdDetails的結果? – ARZ 2011-05-29 12:52:56

+0

哦,我明白了,使用不同的關鍵字:.... select distinct','+ t.n.value(.... – ARZ 2011-05-29 13:12:35

2

最簡單的方法是使用REPLACE。

SELECT 
    InvoiceId, 
    SUBSTRING(
     REPLACE(
      REPLACE(
      CAST(Details AS nvarchar(max)) 
       , '<Stuff Id="', ',') 
       , '"/>', '') 
      ,2, 2000000000) 
FROM 
    MyTable 
+0

我們不能使用Replace方法,因爲在某些情況下,Stuff元素可能具有其他一些屬性!那麼如何使用XQuery獲得相同的結果? – ARZ 2011-05-29 10:08:28

+0

@ARZ:你知道元素被稱爲什麼嗎?這是一個有限的列表,或者你想採取任何舊的XML和解析它...? – gbn 2011-05-29 10:11:49

+0

真的不是一個有限的列表。 – ARZ 2011-05-29 10:23:28

0

也許更好的方法是在xml處理中使用查詢函數而不是子查詢和東西。上的Mikael埃裏克森的回答的基礎上,我發現從this question以下是更快,更簡潔/ readble:

declare @T table(InvoiceId int, Details xml) 
insert into @T 
select 1001, '<Stuff Id="101" p="3" q="5"/><Stuff Id="102" q="4"/><Stuff Id="103"/>' union all 
select 1002, '<Stuff Id="201"/><Stuff Id="202" q="2"/>' 

select InvoiceId, 
    t.n.query('for $i in Stuff return concat($i/@Id, ",")').value('.', 'nvarchar(max)') 
from @T 
    cross apply Details.nodes('.') as t(n) 

然而,得到的字符串包括界定空間和終止逗號。

相關問題