如何跨多行选择和搜索XML数据类型列

时间:2014-05-15 09:22:49

标签: xml sql-server-2012

在其中一个表中,有一个XML数据类型列,它有几个节点和子数据。 我想编写SQL select语句,它从所有行中的特定节点过滤数据,并在列中的xml中给出具有特定值的行。

如果有可能, 我需要SQL select查询的语法和where条件。 我正在使用SQL Server 2012。

感谢。

1 个答案:

答案 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


*/ 

注意:

  1. @temp表有2个字段&#34; Id&#34; (int identity)和&#34; xxml&#34; (XML)。
  2. xml示例:
  3. &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;

    1. 使用@SOME_ATTRIBUTE选择节点x.e.value('(@ID)[1]','nvarchar(10)')中的属性

    2. 从节点x.e.value

      中选择一个值

      a.myXML.query(&#39;数据(/文件/控制/控制[1])&#39)。值(&#39;文本()[1]&#39;&# 39; nvarchar(max)&#39;)&#39; Vendor_Name&#39;

    3. <强>已更新
      与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
      */