Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server 2017中分解XML_Sql_Sql Server_Xml_Sql Server 2017 - Fatal编程技术网

在SQL Server 2017中分解XML

在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:

如果存在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上。

您的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 |
+-----------------------------+------------+------------+