扁平化 SQL 视图的嵌套 XML

问题描述 投票:0回答:1

总结:

给定一个包含各种类型的列(其中一个是 XML 列)的 SQL Server 数据库表,我需要消化每一行的 XML 并在视图中呈现此数据。

为简单起见,假设下表:

表名称:Study

栏目:

  1. StudyId(PK,int,不为空)
  2. 名称(nvarchar,不为空)
  3. 对象(XML,空)

假设 1 行具有以下值:

  1. 123
  2. “一项研究”
  3. 见下文,StackOverflow 不允许我使用代码插入,所以这里是 html...
<objects>
  <Group Name="Group1">
    <Treatment Drug="Grp1DrugA" />
    <Treatment Drug="Grp1DrugB" />
  </Group>
  <Group Name="Group2">
    <Treatment Drug="Grp2DrugC" />
  </Group>
</objects>

所需输出:

Desired Output

注:

以下是我为此尝试过的多种方法中的一些,如果有帮助的话我可以列出更多。

我读过的关于此类操作的大多数帖子都涉及声明的 xml 变量。我的理解是你不能在视图中创建/使用变量,所以我有点卡住了。

方法一:

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)

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

sql-server xml nested view
1个回答
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

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.