在 SQL Server 2017 中粉碎 XML

Posted

技术标签:

【中文标题】在 SQL Server 2017 中粉碎 XML【英文标题】:Shredding XML in SQL Server 2017 【发布时间】:2019-11-18 17:58:51 【问题描述】:

给定以下 SQL:

drop table if exists #testXML

create table #testXML (InputXML xml)

insert into #testXML
values ('<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<document>
<table name="tableName1">
<column name="ID">000010313500011171011710001 </column>
<column name="StartDate">10/27/2019</column>
<column name="EndDate">11/02/2019</column>
</table>
</document>')

我试图得到这样的输出:

ID                                 StartDate     EndDate
000010313500011171011710001        10/27/2019    11/02/2019

这是我的开始,但我只是在这一点上挣扎。

SELECT  
       px1.tbl.value('@name','nvarchar(50)') as TableName
      ,px2.col.value('@name','nvarchar(50)') as ColName
from #testXML px
cross apply   inputxml.nodes ('/document/table') as px1(tbl)
cross apply   inputxml.nodes ('/document/table/column') as px2(col)

这是在 SQL Server 2017 上。

【问题讨论】:

没有动态Sql,无法获取动态列名。您需要获取当前结果并在其上使用动态数据透视技术(本网站上有很多答案) 【参考方案1】:

您的 SQL 需要通过利用 @name 属性值进行如下调整。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (InputXML xml)

INSERT INTO @tbl (InputXML)
VALUES ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<document>
    <table name="tableName1">
        <column name="ID">000010313500011171011710001</column>
        <column name="StartDate">10/27/2019</column>
        <column name="EndDate">11/02/2019</column>
    </table>
</document>');
-- DDL and sample data population, end

SELECT col.value('(column[@name="ID"]/text())[1]','nvarchar(50)') as ID
    , col.value('(column[@name="StartDate"]/text())[1]','DATE') as StartDate
    , col.value('(column[@name="EndDate"]/text())[1]','DATE') as EndDate
FROM @tbl tbl
    CROSS APPLY tbl.InputXML.nodes('/document/table') AS tab(col);

输出

+-----------------------------+------------+------------+
|             ID              | StartDate  |  EndDate   |
+-----------------------------+------------+------------+
| 000010313500011171011710001 | 2019-10-27 | 2019-11-02 |
+-----------------------------+------------+------------+

【讨论】:

以上是关于在 SQL Server 2017 中粉碎 XML的主要内容,如果未能解决你的问题,请参考以下文章

sql OPENXML()在SQL Server中粉碎XML的方法

如何在 SQL 中正确粉碎 XML 文档?

SQL 中 XML 粉碎的替代方案

在 SQL Server 2017 中导入 xml 数据

在 Java 中通过 XSLT 进行 XML 粉碎

带有未声明前缀的 SQL Server Xml 查询