【问题标题】:Query XML with a Unique tag situation查询具有唯一标记情况的 XML
【发布时间】:2015-08-18 00:23:31
【问题描述】:

提前感谢您的帮助!我正在尝试对设置如下的 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 经验,但可以使用示例和说明来说明如何实现。

【问题讨论】:

  • 在此处查看答案:stackoverflow.com/questions/10344553/…。另一个关于如何在 SQL Server 中使用 XML 的好资源,brokenwire.net/bw/Programming/125/…
  • 感谢您的回复,我意识到我现在需要编辑我的问题。那些不直接回答我的问题。我不是在搜索特定的名字组合我想为表格的每一行选择此信息。
  • 您的 XML 似乎被切断了。你能把整件事都贴出来吗?

标签: sql sql-server xml database


【解决方案1】:

你可以像这样使用 XPATH 来实现这个目标

select btrim(xpath('/DictionaryOfStringObject/Item/Value/SerializableDictionaryOfStringObject/item/key/string/text()', column_name)::text,'{"}') 从表

试试吧

【讨论】:

    【解决方案2】:

    可能的查询:

    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,该标签携带所有要作为列输出的信息,在这种情况下,父标签是&lt;SerializableDictionaryOfStringObject&gt;标签。请注意,我使用* 只是为了避免xpath 中的标签名称过长。

    然后在SELECT 子句中,查询通过Key/string 子值过滤&lt;Item&gt; 标记以确定哪个&lt;Item&gt; 对应于哪个列。然后从每个匹配的&lt;Item&gt; 返回对应的Value/anyType child。

    示例输出:

    附注:对于未来的问题,请至少提供格式正确的 XML 示例和准确的预期查询输出(假设该示例 XML 作为输入)。 SQL fiddle 将是此类 SQL 问题的完美补充,请参阅:Tips for asking a good Structured Query Language (SQL) question

    【讨论】:

    • 非常感谢您的回答。我正在尝试查询,但我得到 NULL 返回。我知道这是我自己的错,因为我的问题结构不佳。
    • 想改进您的问题?创建包含示例数据和我建议的查询的 sql fiddle,显示结果为NULL
    • 抱歉@har07 回复延迟。您的询问和解释真的很有帮助。我已经让查询工作了......从某种意义上说,我的查询结构几乎与您的相同,但我收到了一些额外的 NULL 值。 ____________________ |候选人ID|名字|
    • Firstname = Jon,后跟三个 NULL 表示同一候选人
    • 如果无法重现您的问题,很难进一步提供帮助(如 sql fiddle 链接中所示,我没有得到任何 NULL)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多