为 SQL 视图展平嵌套 XML
Flatten Nested XML for SQL View
总结:
给定一个包含各种类型列的 SQL 服务器数据库 table,一个是 XML 列,我需要为每一行消化 XML 和在视图中显示此数据。
为简单起见,假设以下 table:
Table姓名:学习
列:
- StudyId(PK,整数,不为空)
- 名称(nvarchar,不为空)
- 对象(XML,空)
假设 1 行的值如下:
- 123
- "A Study"
- 看下面,Whosebug 不允许我使用代码插入,所以这里是 html...
<objects>
<Group Name="Group1">
<Treatment Drug="Grp1DrugA" />
<Treatment Drug="Grp1DrugB" />
</Group>
<Group Name="Group2">
<Treatment Drug="Grp2DrugC" />
</Group>
</objects>
期望输出:
注:
以下是我为此尝试过的众多方法中的几个,如果有帮助,我可以列出更多。
我读过的关于此类操作的大多数帖子都涉及声明的 xml 变量。我的理解是你不能在视图中 create/use 变量,所以我有点卡住了。
方法一:
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)
我的组列中没有任何内容。
方法二:
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)
这导致 groups/treatments 的每个组合。
我这样试过
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
希望对您有所帮助。
总结:
给定一个包含各种类型列的 SQL 服务器数据库 table,一个是 XML 列,我需要为每一行消化 XML 和在视图中显示此数据。
为简单起见,假设以下 table:
Table姓名:学习
列:
- StudyId(PK,整数,不为空)
- 名称(nvarchar,不为空)
- 对象(XML,空)
假设 1 行的值如下:
- 123
- "A Study"
- 看下面,Whosebug 不允许我使用代码插入,所以这里是 html...
<objects>
<Group Name="Group1">
<Treatment Drug="Grp1DrugA" />
<Treatment Drug="Grp1DrugB" />
</Group>
<Group Name="Group2">
<Treatment Drug="Grp2DrugC" />
</Group>
</objects>
期望输出:
注:
以下是我为此尝试过的众多方法中的几个,如果有帮助,我可以列出更多。
我读过的关于此类操作的大多数帖子都涉及声明的 xml 变量。我的理解是你不能在视图中 create/use 变量,所以我有点卡住了。
方法一:
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)
我的组列中没有任何内容。
方法二:
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)
这导致 groups/treatments 的每个组合。
我这样试过
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
希望对您有所帮助。