sql-server - MS SQL-Server 中具有多个 XML 命名空间的 t-sql

标签 sql-server xml tsql namespaces

大家好,

这类似于其他命名空间问题(例如 StackOverflow Question ),但我似乎无法让我的查询工作。

我有一堆 XML 文档,我把它们放在 MS SQL Server 中,我需要从中提取数据,但我无法控制它们的格式。由于我认为是多个命名空间,我遇到了麻烦。

这是一个示例。

DECLARE @table TABLE (ID INT NOT NULL, XmlContent XML)

INSERT INTO @table VALUES
(1, 
'<PyroSmartDO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="PyroSmartDO_1_1.xsd" Major="0" Minor="0" Build="0" Revision="0">
  <Run Name="1-8-12" CreatedBy="user" CreatedDate="2012-08-02T10:39:33" Status="FINISHED" Type="SQA">
    <RunInfo>
      <WellInfos>
        <WellInfo WellNr="H12">
          <Sample CreatedDate="2012-08-14T16:44:27.765625+05:30">
            <Note>11- 0129</Note>
          </Sample>
        </WellInfo>
        <WellInfo WellNr="H11">
          <Sample CreatedDate="2012-08-14T16:44:27.765625+05:30">
            <Note>11- 0128</Note>
          </Sample>
        </WellInfo>
        <WellInfo WellNr="H10">
          <Sample CreatedDate="2012-08-14T16:44:27.765625+05:30">
            <Note>11- 0127</Note>
          </Sample>
        </WellInfo>
     </WellInfos>
    </RunInfo> 
  </Run>
 </PyroSmartDO>')


SELECT * FROM @table;

SELECT
    Content = XmlContent.value('(/PyroSmartDO/Run/RunInfo/WellInfos/WellInfo/Sample/Note)[1]', 'varchar(50)')

FROM @table
WHERE ID = 1

我是 XML 和 MS SQL Server 的新手,所以其中一些东西对我来说真的很模糊。
  • 我得到了正确的 XML 文档(SELECT *),但我得到的不是 Content='11-0129',而是 Content=NULL。如果我去掉 xmlns="PyroSmartDO_1_1.xsd"查询有效。我真的对命名空间感到困惑,似乎无法让查询在那里使用它。
  • 我其实很想得到所有的样本(我只展示了三个,实际文档有几十个)
  • 我通常使用 CROSS APPLY 遍历 XML 节点,这个查询似乎在没有它的情况下导航 XML。

  • 先感谢您 !

    最佳答案

    由于您对 XML 格式没有任何控制权,因此您可以通过使用以下通配符来掩盖您的命名空间问题:

    SELECT Content = XmlContent.value('(//*:Note)[1]', 'varchar(50)')
      FROM @table
     WHERE ID = 1
    

    但是,您将需要 CROSS APPLY,因为您将需要所有 Note 值而不仅仅是 [1]。

    例如:
    SELECT Content = T.c.value('.', 'VARCHAR(50)')
      FROM @table
           CROSS APPLY 
           XmlContent.nodes('//*:Note') T(c)
    

    关于sql-server - MS SQL-Server 中具有多个 XML 命名空间的 t-sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23252521/

    相关文章:

    sql - 如何用双单引号搜索字符串(sql)

    sql - 查询同一服务器上不同数据库中的两个表

    sql-server - BCP 和 ó 的字符编码问题

    javascript - 从 Nodejs mssql 结果解析 JSON 结果

    SQL Server : workers shift excluding break times

    sql-server - Azure 数据仓库中的表详细信息

    java - XSD 命名空间未出现在 JAXB 编码 XML 中

    sql - 没有返回记录时 ISNULL() 不返回值

    XML 映射器... XE2

    python - 使用 python ElementTree 内存不足