使用唯一标记情况查询XML

时间:2015-06-03 16:47:49

标签: sql sql-server xml database

提前感谢您的帮助!我正在尝试在XML列上编写查询,其设置如下:

<DictionaryOfStringObject>
 <Item>
  <Key>
  <string>Info</string>
  </Key>
  <Value>
   <SerializableDictionaryOfStringObject>    
     <Item>
      <Key>
        <string>FirstName</string>
      </Key>
      <Value>
        <anyType xmlns:q1="http://www.w3.org/2001/XMLSchema" xmlns:d7p1="http://www.w3.org/2001/XMLSchema-instance" d7p1:type="q1:string">JON</anyType>
      </Value>
     </Item>
     <Item>
      <Key>
        <string>MiddleName</string>
      </Key>
      <Value>
        <anyType xmlns:q1="http://www.w3.org/2001/XMLSchema" xmlns:d7p1="http://www.w3.org/2001/XMLSchema-instance" d7p1:type="q1:string" />
      </Value>
    </Item>
    <Item>
      <Key>
        <string>LastName</string>
      </Key>
      <Value>
        <anyType xmlns:q1="http://www.w3.org/2001/XMLSchema" xmlns:d7p1="http://www.w3.org/2001/XMLSchema-instance" d7p1:type="q1:string">SNOW</anyType>
      </Value>
    </Item>
    <Item>
      <Key>
        <string>Gender</string>
      </Key>
      <Value>
        <anyType xmlns:q1="http://www.w3.org/2001/XMLSchema" xmlns:d7p1="http://www.w3.org/2001/XMLSchema-instance" d7p1:type="q1:string">Male</anyType>
      </Value>
    </Item>

我需要在本专栏中提取每个行中的信息。我不是在寻找一个特定的人。我需要从列中为表中的每一行提取此信息。

我理解查询特定人员的单行但是如何开发一个SELECT语句,将在整个表中为每一行提取此信息?

每个人在表中都有一行,我需要一个XML列来开发一个查询,以便针对将为每个人提取信息的表运行。

Row 1 =  FirstName1, LastName1, Gender1   
Row 2 =  FirstName2, LastName2, Gender2

我从来没有为这样的标签写过查询,有人可以协助我为SQL Server 2008SQL Server 2010开发一个Select语句。

我有一些XML经验,但可以使用示例并解释如何实现这一点。

2 个答案:

答案 0 :(得分:0)

你可以使用XPATH来实现这个

选择btrim(xpath(&#39; / DictionaryOfStringObject / Item / Value / SerializableDictionaryOfStringObject / item / key / string / text()&#39;,column_name):: text,&#39; {&#34; }&#39;) 从表

尝试它应该工作

答案 1 :(得分:0)

可能的查询:

SELECT 
  x.value('(Item[Key/string="FirstName"]/Value/anyType)[1]', 'varchar(500)') 
      as 'FirstName',
  x.value('(Item[Key/string="LastName"]/Value/anyType)[1]', 'varchar(500)') 
      as 'LastName',
  x.value('(Item[Key/string="Gender"]/Value/anyType)[1]', 'varchar(500)') 
      as 'Gender'
FROM MyTable t
  OUTER APPLY t.xml.nodes('/*/Item/Value/*') v(x)

<强> SQL Fiddle Demo

简要说明:

基本上,查询对父标记执行OUTER APPLY,该标记包含要作为列输出的所有信息,在这种情况下,父标记为<SerializableDictionaryOfStringObject>标记。请注意,我使用*只是为了避免在xpath中使用冗长的标记名称。

然后在SELECT子句中,查询只是根据<Item>子标记过滤Key/string标记,以确定哪个<Item>对应哪个列。然后从每个匹配<Item>返回相应的Value/anyType子项。

示例输出:

enter image description here

旁注:对于将来的问题,请至少提供格式良好的XML示例和确切的预期查询输出,并将XML作为输入。对于像这样的SQL问题,SQL小提琴将是一个完美的补充,请参阅:Tips for asking a good Structured Query Language (SQL) question