【问题标题】:SQL Server - Querying XML DataTypeSQL Server - 查询 XML 数据类型
【发布时间】:2014-06-04 16:32:17
【问题描述】:

我在将数据收集到 SQL Server 表时导入了几个 XML 文件。

我需要查询此 XML 数据列,以将单个 XML 列转换为更结构化的表。

有人可以帮忙解释一下这里的语法吗,XML 结构有一个模式,因此一旦用 SQL XML.query 格式理解它应该很容易重复我想要的所有元素。

Select TOP 1
   [XMLFILE].value('(/Objs/Obj[0]/TN)[0]','VARCHAR(MAX)') as TEST,
   [XMLFILE].query('/Objs/Obj') as HEADERTEST,
   [XMLFILE].query('/Ref[@id="0"]')  as Property1
FROM 
   SQL_Table

上面只是为我尝试的每个模式返回一个空字符串。

我需要提取每个 obj [] 元素的名称和值。

XML 结构示例,即 objs 标头后跟 obj 节点 0 到 'x' 节点。

<?xml version="1.0"?>
<Objs xmlns="xxxx" Version="1.1.0.1">
  <Obj RefId="0">
    <TN RefId="0">
      <T>xxxx/T>
      <T>xxxxx</T>
      <T>xxxx</T>
    </TN>
    <MS>
      <S N="Name">xxxx</S>
      <S N="Value">xxxx</S>
    </MS>
  </Obj>
  <Obj RefId="1">
    <TNRef RefId="0"/>
    <MS>
      <S N="Name">xxxxxx</S>
      <S N="Value"/>
    </MS>
  </Obj>
  <Obj RefId="2">
    <TNRef RefId="0"/>
    <MS>
      <S N="Name">xxxxx</S>
      <S N="Value"/>
    </MS>
  </Obj>
  <Obj RefId="3">
    <TNRef RefId="0"/>
    <MS>
      <S N="Name">xxxx</S>
      <S N="Value"/>
    </MS>
  </Obj>
......
......
</Objs>

【问题讨论】:

标签: sql sql-server cross-join for-xml-path


【解决方案1】:

几个问题:

  1. 您没有遵守在 XML 顶级节点上定义的 XML 命名空间
  2. 您没有从 XML 中获取适当的节点

试试这个:

-- replace the 'xxx' with whatever is really defined in your <Objs xmlns=....> 
;WITH XMLNAMESPACES(DEFAULT 'xxxx')  
SELECT
    RefId = xc.value('@RefId', 'int'),
    Name = xc.value('(MS/S[@N="Name"])[1]', 'varchar(20)'),
    Value = xc.value('(MS/S[@N="Value"])[1]', 'varchar(20)')
FROM 
   SQL_Table
CROSS APPLY
    XmlFile.nodes('/Objs/Obj') AS XT(XC)

CROSS APPLY 为每个与 XPath 表达式匹配的 XML 节点生成 XML 片段的 on-the-fly 虚拟表 - 这里是为 &lt;Objs&gt; 下的每个 &lt;Obj&gt; 节点。

XQuery 方法.value() 然后“到达”该 XML 片段(针对该虚拟表中的每个片段)并提取所需的必要信息 - 这里是 &lt;Obj&gt; 节点上的 RefId 属性,如以及&lt;MS&gt;/&lt;S N="Name"&gt;&lt;MS&gt;/&lt;S N="Value"&gt; 子节点的文本值。

【讨论】:

  • @user3707945:如果这个答案帮助你解决了你的问题,那么请accept this answer。这将表达您对花费自己的时间帮助您的人们的感激之情。
猜你喜欢
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
相关资源
最近更新 更多