Eri*_* R. 6 xml sql sql-server-2008
我在SQL Server中有一个表,其中一列是XML数据类型.表中还有其他列不是XML.以下是存储在列中的XML示例:
<AdultAsthma>
<Group>
<Question text="Act Score:" ForeColor="Green" />
<Controls>
<Control type="Label" id="txtScore" text="Enter ACT Score:" ForeColor="Black" />
<Control type="TextBox" id="txtActScore" Answer="" />
</Controls>
</Group>
</AdultAsthma>
Run Code Online (Sandbox Code Playgroud)
我想要的是一个查询,它匹配表中其他列的某些值,对于那些匹配的列,我想从问题节点获取text属性,从Control节点获取Answer属性.有人可以帮我弄这个吗?
编辑
如果我有多个Group节点,需要更改什么?在这个场景中,我希望每个问题的文本和答案都与每个问题一致.见下文:
<AdultAsthma>
<Group>
<Question text="Act Score:" ForeColor="Green" />
<Controls>
<Control type="Label" id="txtScore" text="Enter ACT Score:" ForeColor="Black" />
<Control type="TextBox" id="txtActScore" Answer="" />
</Controls>
</Group>
<Group>
<Question text="Do You Have Asthma?:" ForeColor="Black" />
<Controls>
<Control type="RadioButton" id="rbHaveAsthmaYes" text="Yes" GroupName="Diagnosed" ForeColor="Black" Answer="False" />
<Control type="RadioButton" id="rbHaveAsthmaNo" text="No" GroupName="Diagnosed" ForeColor="Black" Answer="False" />
</Controls>
</Group>
</AdultAsthma>
Run Code Online (Sandbox Code Playgroud)
declare @T table
(
XMLCol xml
)
insert into @T values
('<AdultAsthma>
<Group>
<Question text="Act Score:" ForeColor="Green" />
<Controls>
<Control type="Label" id="txtScore" text="Enter ACT Score:" ForeColor="Black"/>
<Control type="TextBox" id="txtActScore" Answer="Answer" />
</Controls>
</Group>
</AdultAsthma>
')
select XMLCol.value(N'(/AdultAsthma/Group/Question/@text)[1]', 'nvarchar(max)'),
XMLCol.value(N'(/AdultAsthma/Group/Controls/Control/@Answer)[1]', 'nvarchar(max)')
from @T
Run Code Online (Sandbox Code Playgroud)
更新:
当您需要将XML分解为多行时,可以.nodes()在a中使用cross apply.
declare @T table
(
XMLCol xml
)
insert into @T values
('<AdultAsthma>
<Group>
<Question text="Act Score:" ForeColor="Green" />
<Controls>
<Control type="Label" id="txtScore" text="Enter ACT Score:" ForeColor="Black" />
<Control type="TextBox" id="txtActScore" Answer="" />
</Controls>
</Group>
<Group>
<Question text="Do You Have Asthma?:" ForeColor="Black" />
<Controls>
<Control type="RadioButton" id="rbHaveAsthmaYes" text="Yes" GroupName="Diagnosed" ForeColor="Black" Answer="False" />
<Control type="RadioButton" id="rbHaveAsthmaNo" text="No" GroupName="Diagnosed" ForeColor="Black" Answer="False" />
</Controls>
</Group>
</AdultAsthma>
')
select X.N.value(N'(Question/@text)[1]', 'nvarchar(max)'),
X.N.value(N'(Controls/Control/@Answer)[1]', 'nvarchar(max)')
from @T as T
cross apply T.XMLCol.nodes(N'/AdultAsthma/Group') as X(N)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6927 次 |
| 最近记录: |