在其中一个表中,有一个XML数据类型列,它有几个节点和子数据。 我想编写SQL select语句,它从所有行中的特定节点过滤数据,并在列中的xml中给出具有特定值的行。
如果有可能, 我需要SQL select查询的语法和where条件。 我正在使用SQL Server 2012。
感谢。
答案 0 :(得分:0)
这是选择查询以获取xml数据中的值的示例
select
tt.id
,cast(x.e.query('.') as nvarchar(50)) as [xml]
,x.e.value('(@ID)[1]','nvarchar(10)') as ID
,x.e.value('(@Name)[1]','nvarchar(10)') as Name
from @temp tt
cross apply tt.xxml.nodes('/FullData/Employees/Employee') as x(e)
/*
RESULT
id xml ID Name
----------- -------------------------------------------------- ---------- ----------
1 <Employee ID="001" Name="David"/> 001 David
1 <Employee ID="002" Name="Mike"/> 002 Mike
1 <Employee ID="003" Name="Alex"/> 003 Alex
1 <Employee ID="004" Name="Morris"/> 004 Morris
2 <Employee ID="005" Name="Fox"/> 005 Fox
2 <Employee ID="006" Name="Perry"/> 006 Perry
2 <Employee ID="007" Name="Duals"/> 007 Duals
2 <Employee ID="008" Name="Harry"/> 008 Harry
*/
注意:
&LT; FullData&GT; &LT;员工与GT; &lt;员工ID =&#34; 005&#34;名称=&#34;福克斯&#34; /&GT; &lt;员工ID =&#34; 006&#34;名称=&#34;佩里&#34; /&GT; &lt;员工ID =&#34; 007&#34;名称=&#34;对偶&#34; /&GT; &lt;员工ID =&#34; 008&#34;名称=&#34;哈利&#34; /&GT; &LT; /员工与GT; &LT;部门及GT; &lt;部门ID =&#34; 02&#34;名称=&#34;移动台&#34; /&GT; &LT; /部门&GT; &LT;组&GT; &lt;组名=&#34;电子&#34; /&GT; &LT; /组&GT; &LT; / FullData&GT;
使用@SOME_ATTRIBUTE选择节点x.e.value('(@ID)[1]','nvarchar(10)')
中的属性
从节点x.e.value
中选择一个值a.myXML.query(&#39;数据(/文件/控制/控制[1])&#39)。值(&#39;文本()[1]&#39;&# 39; nvarchar(max)&#39;)&#39; Vendor_Name&#39;
<强>已更新强>
与where子句
select
tt.id
--,cast(x.e.query('.') as nvarchar(max)) as [xml]
,x.e.value('(@ID)[1]','nvarchar(10)') as ID
,x.e.value('(@Name)[1]','nvarchar(10)') as Name --get /FullData/Employees/Employee attribute value
,x.e.value('.','nvarchar(20)') as email -- get /FullData/Employees/Employee node value
from @temp tt
cross apply tt.xxml.nodes('/FullData/Employees/Employee') as x(e)
where x.e.value('(@ID)[1]','nvarchar(10)') in( '001','002')
/*
RESULT
id ID Name email
----------- ---------- ---------- --------------------
1 001 David David@yahuu.com
1 002 Mike Mike@yahuu.com
*/