在 SQL Server 2017 中粉碎 XML
Shredding XML in SQL Server 2017
鉴于以下 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 需要调整如下,利用 @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);
Output
+-----------------------------+------------+------------+
| ID | StartDate | EndDate |
+-----------------------------+------------+------------+
| 000010313500011171011710001 | 2019-10-27 | 2019-11-02 |
+-----------------------------+------------+------------+
鉴于以下 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 需要调整如下,利用 @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);
Output
+-----------------------------+------------+------------+
| ID | StartDate | EndDate |
+-----------------------------+------------+------------+
| 000010313500011171011710001 | 2019-10-27 | 2019-11-02 |
+-----------------------------+------------+------------+