2017-02-06 27 views
0

摘要:展平嵌套XML用於SQL視圖

由於含有多種類型的列一個SQL Server數據庫表,一個是XML列,我需要消化每一行的XML和呈現這些數據一個看法。

假設下表爲簡單起見:

表名:研究

列:

  1. StudyId(PK,INT NOT NULL)
  2. 名稱(nvarchar的,不空)
  3. 對象(XML,null)

假設1行中的以下值:

  1. 「研究」
  2. 見下文,StackOverflow上不會讓我用代碼插入,所以這裏是爲html ...

<objects> 
 
    <Group Name="Group1"> 
 
    <Treatment Drug="Grp1DrugA" /> 
 
    <Treatment Drug="Grp1DrugB" /> 
 
    </Group> 
 
    <Group Name="Group2"> 
 
    <Treatment Drug="Grp2DrugC" /> 
 
    </Group> 
 
</objects>

所需的輸出:

Desired Output

注:

這裏有幾個我已經試過這樣做的許多方法,我可以列出更多,如果這將是有益的。

我在這些類型的操作上讀過的大多數帖子都涉及一個聲明的xml變量。我的理解是,你不能在視圖內創建/使用變量,所以我有點卡住了。

方法1:

select stud.StudyId, 
    stud.Name as 'StudyName', 
    tbl.treatment.value('(../Group/@Name)[1]','varchar(30)') as 'Group', 
    tbl.treatment.value('(@Drug)[1]', 'varchar(30)') as 'Drug' 

from dbo.Study stud 
cross apply stud.StudyObjects.nodes('//Group/Treatment') as tbl(treatment) 

這給我什麼,我Group列。

方法2:

select stud.StudyId, 
    stud.Name as 'StudyName', 
    grp.value('(@Name)[1]', 'varchar(30)') as 'Group', 
    treatment.value('(@Drug)[1]', 'varchar(30)') as 'Drug' 

from dbo.Study stud 
    cross apply stud.StudyObjects.nodes('//Group') as table1(grp) 
    cross apply grp.nodes('//Group/Treatment') as table2(treatment) 

這導致的基團/每治療組合。

回答

2

我試過這樣

SELECT 
     StudyId 
     ,Name 
     ,o.value('../@Name', 'varchar(30)') [Group] 
     ,o.value('@Drug', 'varchar(30)') Drug 
    FROM Study S 
     CROSS APPLY S.[Objects].nodes('objects/Group/Treatment') xmlData(o) 

得到這個結果

StudyId  Name  Group  Drug 
----------- ---------- ------------ ------------ 
123   A Study Group1  Grp1DrugA 
123   A Study Group1  Grp1DrugB 
123   A Study Group2  Grp2DrugC 

希望它能幫助。

+0

這很好,謝謝。 – WyattE