sql - 将 XML 文件水平导入到 SQL Server

标签 sql sql-server xml

我正在尝试将 XML 数据导入 SQL Server。我找到了下面的链接。

Import XML to SQL Server

我的要求略有不同,我需要使用 <name> 创建表作为列名称和 <value>作为列值。像下面这样

XML:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:toatech:ResourceManagement:1.0">
   <SOAP-ENV:Body>
      <ns1:get_resources_list_response>
         <result_code>0</result_code>
         <resources>
            <resource>
               <properties>
                  <property>
                     <name>id</name>
                     <value>CAP_LOAD_TEST</value>
                  </property>
                  <property>
                     <name>status</name>
                     <value>inactive</value>
                  </property>
                  <property>
                     <name>parent_id</name>
                     <value>ABC_CO</value>
                  </property>
                  <property>
                     <name>type</name>
                     <value>GR</value>
                  </property>
                  <property>
                     <name>name</name>
                     <value>Capacity LoadTesting</value>
.
.
.
.

代码:

DECLARE @XmlFile XML

SELECT @XmlFile = BulkColumn  
FROM OPENROWSET(BULK 'C:\Users\GET_RESOURCE_LIST.xml', SINGLE_BLOB) x

SELECT 
    Resource_id = resource.value('(value)[1]', 'varchar(255)'),
    Resource_status = resource.value('(value)[2]', 'varchar(255)')
 FROM
@XmlFile.nodes('//resources/resource/properties/property') AS XTbl1(resource)

因此,当“资源”项重复时,它应该是表中具有新值集的新行

预期表输出:

    id              status      parent_id   type    name
    ==              ======      =========   ====    ====
    CAP_LOAD_TEST   inactive    ABC_CO      GR      Capacity LoadTesting

... 

使用上面的代码,所有值都会填充到一列中。这就是问题所在。

最佳答案

您需要PIVOT动态查询操作:

DECLARE @xml XML = N'<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:toatech:ResourceManagement:1.0">
   <SOAP-ENV:Body>
      <ns1:get_resources_list_response>
         <result_code>0</result_code>
         <resources>
            <resource>
               <properties>
                  <property>
                     <name>id</name>
                     <value>CAP_LOAD_TEST</value>
                  </property>
                  <property>
                     <name>status</name>
                     <value>inactive</value>
                  </property>
                  <property>
                     <name>parent_id</name>
                     <value>ABC_CO</value>
                  </property>
                  <property>
                     <name>type</name>
                     <value>GR</value>
                  </property>
                  <property>
                     <name>name</name>
                     <value>Capacity LoadTesting</value>
                  </property>
                </properties>
             </resource>
             </resources>
    </ns1:get_resources_list_response>
            </SOAP-ENV:Body>
</SOAP-ENV:Envelope>'

DECLARE @Output nvarchar(max) = N''
DECLARE @PivotList nvarchar(max)


SELECT 
    @PivotList = COALESCE(@PivotList + ', ', N'') + N'[' + XC.value('./name[1]', 'varchar(255)') + N']'
FROM 
    @xml.nodes('//resources/resource[1]/properties/property') AS XT(XC)

SET @Output = N'SELECT 
    '+@PivotList+N'
FROM
(
    SELECT 
        Resource_id = resource.value(''(name)[1]'', ''varchar(255)''),
        Resource_status = resource.value(''(value)[1]'', ''varchar(255)''),
        unique_b_node = resource.value(''for $i in . return count(../../../*[. << $i]) + 1'', ''int'')
     FROM
    @xml.nodes(''//resources/resource/properties/property'') AS XTbl1(resource)
) AS s
PIVOT
(
    MAX(Resource_status)
    FOR Resource_id IN ('+@PivotList+N')
) AS t;'

EXEC sp_executesql @Output, N'@xml xml', @xml = @xml;

关于sql - 将 XML 文件水平导入到 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32217652/

相关文章:

sql-server - 无法远程或通过 IP 访问 SQL Server,但可以使用 localhost 或计算机名在本地访问它

sql - 插入大量记录而不锁定表

java - 接受/返回 XML/JSON 请求和响应 - Spring MVC

java - Spring请求url Action 类映射

sql - 重构字段的外键

sql - 根据第二列值对列中的不同行求和

sql - 删除重复记录 SQL Server

xml - 如何使用 XSLT 删除重复的 XML 节点

sql - LEFT JOIN - 如何连接表并包括额外的行,即使你有正确的匹配

sql - PostgreSQL SQL语句生成自定义blob存储表