1

我在将数据收集到 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>
4

1 回答 1

0

几个问题:

  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)

为每个与 XPath 表达式匹配的 XML 节点生成一个动态的 XML 片段虚拟表-这里CROSS APPLY针对.<Obj><Objs>

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

于 2014-06-04T17:24:54.497 回答