我进行了不同的搜索,发现了许多类似的帖子,其中给出了将XML转换为表格格式的解决方案。
下面是我要附加的一行列的示例数据,也是到目前为止我所做的基本查询。

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

query如下:
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

这只是获取第一个节点的值,我想在一个查询中动态选择所有节点,可能使用cursor
给出的数据是单行的,我有100多行需要转换成表格格式。
任何好的建议都会有帮助的。

最佳答案

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

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

10-01 07:56