展平SQL View的嵌套XML

时间:2017-02-06 22:34:28

标签: sql-server xml nested views

要点:

鉴于SQL Server db表包含各种类型的列,其中一列是XML列,我需要为每行摘要XML并在视图中显示这些数据。

为简单起见,请假设下表:

表名:研究

列:

  1. StudyId(PK,int,not null)
  2. 名称(nvarchar,非null)
  3. 对象(XML,null)
  4. 假设1行的以下值:

    1. 123
    2. “学习”
    3. 见下文,StackOverflow不允许我使用代码插入,所以这里是html ...
    4. <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)
      

      这在我的小组专栏中没有任何内容。

      方法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)
      

      这导致每组/治疗的组合。

1 个答案:

答案 0 :(得分: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

希望它有所帮助。