【问题标题】:How to write this SQL query for a XML type?如何为 XML 类型编写这个 SQL 查询?
【发布时间】:2018-10-04 02:36:29
【问题描述】:

我正在使用 SQL Server 2012,其中有一个表 [abc],其中有一列名为 [Information][XML] 类型的列。

此列的值类似于 -

<Information>
  <Groups>
    <Group Name="Monitor">
      <Items>
        <Item>
          <Name>Cid</Name>
          <Value>2323232323</Value>
        </Item>
        <Item>
          <Name>Tid</Name>
          <Value>6656565656</Value>
        </Item>
      </Items>
    </Group>
  </Groups>
</Information>

如何编写一个 SQL Query 来查询该列 - [Information] 并进一步从名称 /value 中提取 [Tid] 的值?

【问题讨论】:

    标签: xml tsql xpath sql-server-2012 xquery


    【解决方案1】:

    尝试以下方法:

    DECLARE @abc TABLE(ID INT IDENTITY, Information XML);
    INSERT INTO @abc VALUES
    (N'<Information>
      <Groups>
        <Group Name="Monitor">
          <Items>
            <Item>
              <Name>Cid</Name>
              <Value>2323232323</Value>
            </Item>
            <Item>
              <Name>Tid</Name>
              <Value>6656565656</Value>
            </Item>
          </Items>
        </Group>
      </Groups>
    </Information>');
    

    --此查询使用XQuery 谓词获取唯一值(&lt;Value&gt;,其中&lt;Name&gt; 是“Tid”)

    SELECT ID
          ,Information
          ,Information.value(N'(/Information/Groups/Group/Items/Item[Name/text()="Tid"]/Value/text())[1]',N'bigint') AS ValueInTid
    FROM @abc AS abc;
    
    --Result=6656565656
    

    --此查询使用.nodes() 获取所有(重复)&lt;Group&gt; 节点,而不是再次使用.nodes() 返回(重复)&lt;Item&gt; 节点。结果是一个完整的表格:

    SELECT gr.value(N'@Name',N'nvarchar(max)') AS GroupName
          ,itm.value(N'(Name/text())[1]',N'nvarchar(max)') AS ItemName
          ,itm.value(N'(Value/text())[1]',N'nvarchar(max)') AS ItemValue
    FROM @abc AS abc
    OUTER APPLY abc.Information.nodes(N'/Information/Groups/Group') AS A(gr)
    OUTER APPLY A.gr.nodes(N'Items/Item') AS B(itm);
    

    结果

    GroupName   ItemName    ItemValue
    Monitor     Cid         2323232323
    Monitor     Tid         6656565656
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-18
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多