2016-05-20 32 views
0

我目前能夠將1個XML轉換爲表格,但我試圖將所有xml都轉換爲一張表格。我有大約600萬個XML條目,我希望一次完成,然後進行排序。有任何想法嗎?SQL Server:將多個XML轉換爲表格

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'; 

輸出:

id localname   text 
--------------------------------------------- 
4 ID     436875364 
5 TP_CUSTOMER_ID  400108792109 
6 TP_ACCOUNT_ID  400204158957 
7 TP_ACCOUNT_TXN_ID 409420594138 
8 INSTITUTION_TXN_ID INTUIT-409420594138 
9 POSTED_DATE   2016-05-14T03:00:00 
+1

向我們展示一些XML。這應該很容易用XML方法代替OPENXML。但是它的不同之處在於我們需要了解XML的外觀。 – RBarryYoung

回答

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; 
0

如果XML文件的架構都是一樣的話,我建議你只需將XML文件合併到通過PowerShell的單個文件。然後,然後在組合文件中的SQL Server中運行您的查詢。

以下功率的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」更改爲所需的輸出文件位置。