sql - 如何通过 SQL Server 从 XML 中的节点获取值

标签 sql sql-server xml xquery

我在网上找到了几条关于此的信息,但我无法让它在我的生活中发挥作用。

这是我的 XML:

enter image description here

我需要提取每个节点的 ID 和名称值。有很多。

我尝试这样做但它返回 NULL:

select [xml].value('(/Alter/Object/ObjectDefinition/MeasureGroup/Partitions/Partition/ID)[1]', 'varchar(max)')
from test_xml

我知道上面只会返回 1 条记录。我的问题是,如何返回所有记录?

这是 XML 文本(精简版):

<Alter xmlns="http://schemas.microsoft.com/analysisservices/2003/engine" AllowCreate="true" ObjectExpansion="ExpandFull">
  <ObjectDefinition>
    <MeasureGroup xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <ID>ts_homevideo_sum_20140430_76091ba1-3a51-45bf-a767-f9f3de7eeabe</ID>
      <Name>table_1</Name>
      <StorageMode valuens="ddl200_200">InMemory</StorageMode>
      <ProcessingMode>Regular</ProcessingMode>
      <Partitions>
        <Partition>
          <ID>123</ID>
          <Name>2012</Name>
        </Partition>
        <Partition>
          <ID>456</ID>
          <Name>2013</Name>
        </Partition>
      </Partitions>
    </MeasureGroup>
  </ObjectDefinition>
</Alter>

最佳答案

你需要这样的东西:

DECLARE @MyTable TABLE (ID INT NOT NULL, XmlData XML)

INSERT INTO @MyTable (ID, XmlData)
VALUES (1, '<Alter xmlns="http://schemas.microsoft.com/analysisservices/2003/engine" AllowCreate="true" ObjectExpansion="ExpandFull">
  <ObjectDefinition>
    <MeasureGroup xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <ID>ts_homevideo_sum_20140430_76091ba1-3a51-45bf-a767-f9f3de7eeabe</ID>
      <Name>table_1</Name>
      <StorageMode valuens="ddl200_200">InMemory</StorageMode>
      <ProcessingMode>Regular</ProcessingMode>
      <Partitions>
        <Partition>
          <ID>123</ID>
          <Name>2012</Name>
        </Partition>
        <Partition>
          <ID>456</ID>
          <Name>2013</Name>
        </Partition>
      </Partitions>
    </MeasureGroup>
  </ObjectDefinition>
</Alter>')

;WITH XMLNAMESPACES(DEFAULT 'http://schemas.microsoft.com/analysisservices/2003/engine')
SELECT 
    tbl.ID,
    MeasureGroupID = xc.value('(ID)[1]', 'varchar(200)'),
    MeasureGroupName = xc.value('(Name)[1]', 'varchar(200)'),
    PartitionID = xp.value('(ID)[1]', 'varchar(200)'),
    PartitionName = xp.value('(Name)[1]', 'varchar(200)')
FROM
    @MyTable tbl
CROSS APPLY
    tbl.XmlData.nodes('/Alter/ObjectDefinition/MeasureGroup') AS XT(XC)
CROSS APPLY
    XC.nodes('Partitions/Partition') AS XT2(XP)
WHERE   
    ID = 1

首先,您必须尊重并包含在 XML 文档的根目录中定义的默认 XML 命名空间

接下来,您需要对 .nodes() 进行嵌套调用以获取所有 <MeasureGroup> 和所有包含的 <Partition> 节点,以便您可以进入这些 XML 片段并从中提取 IDName

这应该会导致像这样的输出:

enter image description here

关于sql - 如何通过 SQL Server 从 XML 中的节点获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53674177/

相关文章:

sql - SQL Server 中的不精确列是什么?

sql - 我应该如何在 SQL Server 2005 中使用 BIT

sql - 当查询返回多行时,Oracle extractValue 失败

sql-server - 我们不能省略数据库触发器吗?

sql - 寻求 MS SQL 函数的解释

xml - 使用 XSLT 以外的其他解决方案解析 XML

sql - XML 数据作为历史记录

sql - 能够加入 MySQL 的合理行数和表数是多少?

c# - 为什么长时间运行不返回任何数据的 SQL 命令会产生数百 MB 的网络流量

python - Python的xlrd如何防止 "billion laughs"DoS攻击?