SQL Server:将多个XML转换为表

时间:2016-05-20 16:49:22

标签: sql-server xml

我目前能够将1个XML转换为表,但我试图将所有xml转换为单个表。我有大约600万个XML条目,我想一次性完成然后排序。有什么想法吗?

catLabel.text

输出:

DECLARE @docHandle INT;
SET @docHandle = 0;

DECLARE @xml XML;

SELECT @xml = XMLData
FROM DaTable
WHERE FileType = 'Transaction';

EXEC sp_xml_preparedocument @docHandle OUTPUT, @xml;

SELECT sub.id, sub.localname, val.[text]
FROM OPENXML(@docHandle, N'') AS par
LEFT JOIN OPENXML(@docHandle, N'') AS sub
    ON sub.parentid = par.id
LEFT JOIN OPENXML(@docHandle, N'') AS val
    ON val.parentid = sub.id

WHERE sub.localname != 'xsd'
  AND sub.localname != 'xsi'
  AND sub.localname != '#text';

2 个答案:

答案 0 :(得分:1)

认为你只需使用光标。

DECLARE @xml XML;
DECLARE @cursor CURSOR;
SET @cursor = CURSOR FAST_FORWARD FOR
SELECT XMLData FROM DaTable WHERE FileType = 'Transaction';

DECLARE @result TABLE
    (tag_name nvarchar(100) NOT NULL,
    xml_text nvarchar(100) NOT NULL);

OPEN @cursor;
WHILE 1 = 1 BEGIN
    FETCH NEXT FROM @cursor INTO @xml;
    IF @@FETCH_STATUS < 0 BREAK;

    INSERT INTO @result (tag_name, xml_text)
    SELECT node.value('local-name(..)', 'nvarchar(100)'),
        node.value('.', 'nvarchar(100)')
    FROM @xml.nodes('//text()') q(node);
END;

CLOSE @cursor;
DEALLOCATE @cursor;

SELECT tag_name, xml_text FROM @result;

答案 1 :(得分:0)

如果xml文件的架构完全相同,那么我建议您只需通过PowerShell将xml文件合并到一个文件中。然后,然后在组合文件中的SQL Server中运行您的查询。

我在堆栈溢出时找到的以下power shell脚本应该可以完成这项工作:

    $xmldoc = new-object xml
    $rootnode = $xmldoc.createelement("xml")
    $xmldoc.appendchild($rootnode)
    $dec = $xmldoc.CreateXmlDeclaration("1.0", $null, $null)
    $xmldoc.InsertBefore($dec, $rootnode)
    $files = gci "c:\source_files\*.xml" 
    foreach ($file in $files) {
        $xmltoadd = select-xml -path $file.FullName -xpath "/*"
        $xml2 = $xmltoadd.node.InnerXml
        $finalxml += $xml2
    }
    $rootnode.innerxml = $finalxml
    $xmldoc.Save("C:\final_output\combined.xml")

将目录字符串“c:\ source_files \”替换为xml文件所在的目录。同时将保存位置“C:\ final_output \ combined.xml”更改为所需的输出文件位置。