通过 XQuery 将嵌套的 XML 转换为平面 xml

约翰去

我有一段嵌套的 XML,我想插入到 SQL 中。

导入 XML:

 <RECORD>
    <RECID>118810</RECID>
    <FIELD TYPE="C">
       <NAME>proj_code</NAME>
       <VALUE>118810</VALUE>
    </FIELD>
    <FIELD TYPE="C">
       <NAME>sub_nr</NAME>
       <VALUE>99900</VALUE>
    </FIELD>
    <FIELD TYPE="C">
       <NAME>proj_desc</NAME>
       <VALUE>Nagekomen kosten Oktober 2018</VALUE>
    </FIELD>
    <FIELD TYPE="N">
       <NAME>pro_stat</NAME>
       <VALUE>9</VALUE>
    </FIELD>
    <FIELD TYPE="C">
       <NAME>comment</NAME>
       <VALUE></VALUE>
    </FIELD>
</RECORD>

我想通过 XQuery 将其转换为:

<RECORD>
    <RECID>118810</RECID>
    <proj_code>118810</proj_code>
    <sub_nr>99900</sub_nr>
    <proj_desc>Nagekomen kosten Oktober 2018</proj_desc>
    <pro_stat>9</pro_stat>
    <comment></comment>
</RECORD>

所以我可以将它导入到 SQL 中。

有什么想法吗?

伊扎克·哈宾斯基

正如 Martin Honnen 指出的,MS SQL Server XQuery 不支持计算的动态元素名称,只支持文字。不幸的是,甚至包括最新的 SQL Server 2019。这是一个丑陋的解决方案。

SQL

DECLARE @xml XML = N'<root>
    <RECORD>
        <RECID>118810</RECID>
        <FIELD TYPE="C">
            <NAME>proj_code</NAME>
            <VALUE>118810</VALUE>
        </FIELD>
        <FIELD TYPE="C">
            <NAME>sub_nr</NAME>
            <VALUE>99900</VALUE>
        </FIELD>
        <FIELD TYPE="C">
            <NAME>proj_desc</NAME>
            <VALUE>Nagekomen kosten Oktober 2018</VALUE>
        </FIELD>
        <FIELD TYPE="N">
            <NAME>pro_stat</NAME>
            <VALUE>9</VALUE>
        </FIELD>
        <FIELD TYPE="C">
            <NAME>comment</NAME>
            <VALUE></VALUE>
        </FIELD>
    </RECORD>
    <RECORD>
        <RECID>118811</RECID>
        <FIELD TYPE="C">
            <NAME>proj_code</NAME>
            <VALUE>118811</VALUE>
        </FIELD>
        <FIELD TYPE="C">
            <NAME>sub_nr</NAME>
            <VALUE>99901</VALUE>
        </FIELD>
        <FIELD TYPE="C">
            <NAME>proj_desc</NAME>
            <VALUE>Nagekomen kosten November 2019</VALUE>
        </FIELD>
        <FIELD TYPE="N">
            <NAME>pro_stat</NAME>
            <VALUE>19</VALUE>
        </FIELD>
        <FIELD TYPE="C">
            <NAME>comment</NAME>
            <VALUE>wow</VALUE>
        </FIELD>
    </RECORD>
</root>';

DECLARE @tbl TABLE (ID INT IDENTITY(1,1) PRIMARY KEY, RECID VARCHAR(10), [col_name] VARCHAR(20), [col_value] VARCHAR(100));

INSERT INTO @tbl
SELECT c.value('(../RECID/text())[1]', 'VARCHAR(100)') AS [RECID] 
    , c.value('(NAME/text())[1]', 'VARCHAR(30)') AS [name]
    , c.value('(VALUE/text())[1]', 'VARCHAR(100)') AS [value]
FROM @xml.nodes('root/RECORD/FIELD') AS t(c);

DECLARE @RowCount INT = (SELECT MAX(ID) FROM @tbl)
    , @recID varchar(10) = (SELECT TOP(1) RECID FROM @tbl WHERE ID = 1)
    , @xml_data VARCHAR(MAX) = '<root><RECORD>';

WHILE @RowCount > 0 BEGIN
    SELECT @xml_data += IIF(@recID != RECID, '</RECORD><RECORD>', '') + 
        --'<' + [col_Name] + '>' + COALESCE([col_value],'') + '</' + [col_Name] + '>'
        CONCAT('<',[col_Name],'>',[col_value],'</',[col_Name],'>')
        , @recID = RECID
    FROM @tbl 
    ORDER BY ID DESC OFFSET @RowCount - 1 ROWS FETCH NEXT 1 ROWS ONLY;

    SET @RowCount -= 1;
END;

SET @xml_data += '</RECORD></root>';
SELECT CAST(@xml_data AS XML);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章