簡體   English   中英

SQL查詢以將XML數據解析為多列

[英]SQL Query to parse XML data to multiple columns

我剛接觸XML。 我已經審查了幾篇文章,並且很難完成這項任務。

我有一個名為tbl.AccountLogs的SQL Server 2008R2表,該表具有以下列-源,日期,ID和詳細信息(XML數據)

我試圖通過XML字段“ Details”解析為幾列。 該字段可以具有許多標簽和嵌套標簽。

這是一個例子:

<errors>
<error date = '1394746874'>
    <detail id = '3342867234'>
        <arg type = '0'><![CDATA[512,107,741,184]]></arg>
        <arg type = '0'><![CDATA[274,877,906,944]]></arg>
        <arg type = '0'><![CDATA[J:\]]></arg>
        <arg type = '0'><![CDATA[TestLine.img]]></arg>
    </detail>
</error>

<error date = '1394747022'>
    <detail id = '3342867234'>
        <arg type = '0'><![CDATA[28,594,585,600]]></arg>
        <arg type = '0'><![CDATA[21,474,836,480]]></arg>
        <arg type = '0'><![CDATA[C:\Safe\]]></arg>
        <arg type = '0'><![CDATA[{BigMonster}]]></arg>
    </detail>
</error>

</errors>

如前所述,每個記錄的“錯誤”數可以更改,但是“ arg類型”和“詳細信息ID”是一致的。

輸出示例如下: 在此處輸入圖片說明

任何幫助將不勝感激!

試試這個,希望它可以幫助您朝正確的方向前進:

--if temp table exists drop it
    IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp
go
CREATE TABLE #tmp ( your_xml NVARCHAR(MAX) )

GO
--insert data
INSERT INTO #tmp SELECT '<errors>
<error date = ''1394746874''>
    <detail id = ''3342867234''>
        <arg type = ''0''><![CDATA[512,107,741,184]]></arg>
        <arg type = ''0''><![CDATA[274,877,906,944]]></arg>
        <arg type = ''0''><![CDATA[J:\]]></arg>
        <arg type = ''0''><![CDATA[TestLine.img]]></arg>
    </detail>
</error>

<error date = ''1394747022''>
    <detail id = ''3342867234''>
        <arg type = ''0''><![CDATA[28,594,585,600]]></arg>
        <arg type = ''0''><![CDATA[21,474,836,480]]></arg>
        <arg type = ''0''><![CDATA[C:\Safe\]]></arg>
        <arg type = ''0''><![CDATA[{BigMonster}]]></arg>
    </detail>
</error>

</errors>'--END of xml


SELECT 

   'Record'+Convert(nvarchar(50), (ROW_NUMBER() OVER (ORDER BY x.y.value('(./detail[1]/arg)[1]', 'nvarchar(100)')))) AS [Source],
    x.y.value('@date', 'nvarchar(100)') AS [Date],
    x.y.value('./detail[1]/@id', 'nvarchar(100)') AS ID,
    x.y.value('(./detail[1]/arg)[1]', 'nvarchar(100)') AS Detail1,
    x.y.value('(./detail[1]/arg)[2]', 'nvarchar(100)') AS Detail2,
    x.y.value('(./detail[1]/arg)[3]', 'nvarchar(100)') AS Detail3,
    x.y.value('(./detail[1]/arg)[4]', 'nvarchar(100)') AS Detail4

FROM
    (
    SELECT CAST( your_xml AS XML ) AS your_xml
    FROM #tmp
    ) t
    CROSS APPLY t.your_xml.nodes('//errors/error') x(y)

基本上,您使用CROSS APPLY並使用Properties.value來檢索XML的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM