简体   繁体   中英

How to read XML file into tabular format in SQL Server

I have gone through different search and found many similar posts in which the solution was given to transform XML into Tabular format. Below is the sample data of a single row's column I'm attaching and also the basic query which I have done so far.

<DS_systeminfo>
<Systeminfo>
  <Property>CurrentLanguage</Property>
  <Property_value>en-US</Property_value>
</Systeminfo>
<Systeminfo>
  <Property>Manufacturer</Property>
  <Property_value>LENOVO</Property_value>
</Systeminfo>
<Systeminfo>
  <Property>SerialNumber</Property>
  <Property_value>789654</Property_value>
</Systeminfo>
<Systeminfo>
  <Property>Caption</Property>
  <Property_value>ATTT</Property_value>
</Systeminfo>   
  <Property>Manufacturer</Property>
  <Property_value>LENOVO</Property_value>
</Systeminfo>  
<Systeminfo>
  <Property>WindowsDirectory</Property>
  <Property_value>C:\WINDOWS</Property_value>
</Systeminfo>

and the query is below:

SELECT SerialNumber, 
Cast(SystemInfoXML AS XML).value('(/DS_systeminfo/Systeminfo/Property)[1]', 'varchar(100)') AS Caption,
Cast(SystemInfoXML AS XML).value('(/DS_systeminfo/Systeminfo/Property_value)[1]', 'varchar(100)') AS Value
FROM TerminalsDetail

This is fetching only first node's value , I want to select all the nodes dynamically in a single query , may be using cursor .

the data given is of single row, I have more over 100 rows for which I need to convert to tabular format.

any kind suggestion will be helpful.

Declare @YourTable table (ID int,SystemInfoXML xml)
Insert Into @YourTable values
(1,'<DS_systeminfo><Systeminfo><Property>CurrentLanguage</Property><Property_value>en-US</Property_value></Systeminfo><Systeminfo><Property>Manufacturer</Property><Property_value>LENOVO</Property_value></Systeminfo><Systeminfo><Property>SerialNumber</Property><Property_value>789654</Property_value></Systeminfo><Systeminfo><Property>Caption</Property><Property_value>ATTT</Property_value></Systeminfo><Systeminfo><Property>Manufacturer</Property><Property_value>LENOVO</Property_value></Systeminfo><Systeminfo><Property>WindowsDirectory</Property><Property_value>C:\WINDOWS</Property_value></Systeminfo></DS_systeminfo>')

Select A.ID
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select [Caption] = f.n.value('(Property)[1]','varchar(50)') 
                      ,[Value]   = f.n.value('(Property_value)[1]','varchar(50)') 
                 From  A.SystemInfoXML.nodes('DS_systeminfo') t(n)
                 Cross Apply t.n.nodes('Systeminfo') f(n)
             ) B

Returns

ID  Caption           Value
1   CurrentLanguage   en-US
1   Manufacturer      LENOVO
1   SerialNumber      789654
1   Caption           ATTT
1   Manufacturer      LENOVO
1   WindowsDirectory  C:\WINDOWS

Something like this:

WITH the_data AS (
  SELECT CAST(SystemInfoXML AS XML) AS XML_DATA
  FROM TerminalsDetail
)
SELECT 
  XML_DATA.query('/DS_systeminfo/Systeminfo/Property[1]') as Caption,
  XML_DATA.query('/DS_systeminfo/Systeminfo/Property_value[1]') as Value
FROM cte

Hat Tip

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM