在SQL Server 2017中分解XML
给定以下SQL: 如果存在testXML,则删除表 创建表testXML InputXML xml 插入到testXML中 价值观 000010313500011171011710001 10/27/2019 11/02/2019 ' 我试图获得如下输出: ID开始日期结束日期 000010313500011171011710001 10/27/2019 11/02/2019 这是我的开始,但我只是在这一点上挥舞 选择 px1.tbl.value'@name','nvarchar50'作为TableName ,px2.col.value'@name','nvarchar50'作为ColName 来自TestXMLPX 交叉应用inputxml.nodes'/document/table'作为px1tbl 交叉应用inputxml.nodes'/document/table/column'作为px2col在SQL Server 2017中分解XML,sql,sql-server,xml,sql-server-2017,Sql,Sql Server,Xml,Sql Server 2017,给定以下SQL: 如果存在testXML,则删除表 创建表testXML InputXML xml 插入到testXML中 价值观 000010313500011171011710001 10/27/2019 11/02/2019 ' 我试图获得如下输出: ID开始日期结束日期 000010313500011171011710001 10/27/2019 11/02/2019 这是我的开始,但我只是在这一点上挥舞 选择 px1.tbl.value'@name','nvarc
这是在SQL Server 2017上。您的SQL需要通过利用@name属性值进行如下调整 SQL
您的SQL需要通过利用@name属性值进行如下调整 SQL
没有动态Sql,您无法获取动态列名。您需要获取当前的结果并使用动态透视技术—在这个网站上有很多答案—如果没有动态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 |
+-----------------------------+------------+------------+