从XML到SQL Server临时表中提取信息

时间:2018-01-11 12:56:25

标签: sql sql-server xml

我正在处理一些XML,但我遇到了问题。

xml看起来像这样:

<tagvalues>
  <tagvalue>
    <tag>Data.Barcode</tag>
    <value>True</value>
  </tagvalue>
  <tagvalue>
    <tag>Data.DateStampFirstScale</tag>
    <value>20180111</value>
  </tagvalue>
  <tagvalue>
    <tag>Data.DateStampLastScale</tag>
    <value>20180111</value>
  </tagvalue>
  <tagvalue>
    <tag>Data.Dot</tag>
    <value>False</value>
  </tagvalue>
  <tagvalue>
    <tag>Data.Hangtab</tag>
    <value>False</value>
  </tagvalue>
  <tagvalue>
    <tag>Data.Scale_x.Scale_0.Deviation</tag>
    <value>0</value>
  </tagvalue>
  <tagvalue>
    <tag>Data.Scale_x.Scale_0.DeviationHigh</tag>
    <value>False</value>
  </tagvalue>
  <tagvalue>
    <tag>Data.Scale_x.Scale_0.DeviationLimitHigh</tag>
    <value>0</value>
  </tagvalue>
</tagvalues>

目前我正在使用此代码获取数据:

@data.value('/tagvalues[1]/tagvalue[3]/value[1]', 'nvarchar(100)')

我遇到的问题是,有时订单会发生变化,这意味着我必须重新配置它。

是否无法将XML文本转换为临时表,如下所示:

Tag                                     Value
--------------------------------------------------
Data.Barcode                            TRUE
Data.DateStampFirstScale                20180111
Data.DateStampLastScale                 20180111
Data.Dot                                FALSE
Data.Hangtab                            FALSE
Data.Scale_x.Scale_0.Deviation          0
Data.Scale_x.Scale_0.DeviationHigh      FALSE
Data.Scale_x.Scale_0.DeviationLimitHigh 0

2 个答案:

答案 0 :(得分:1)

你的意思是这样吗?

DECLARE @XML xml;
SET @XML = 
'<tagvalues>
  <tagvalue>
    <tag>Data.Barcode</tag>
    <value>True</value>
  </tagvalue>
  <tagvalue>
    <tag>Data.DateStampFirstScale</tag>
    <value>20180111</value>
  </tagvalue>
  <tagvalue>
    <tag>Data.DateStampLastScale</tag>
    <value>20180111</value>
  </tagvalue>
  <tagvalue>
    <tag>Data.Dot</tag>
    <value>False</value>
  </tagvalue>
  <tagvalue>
    <tag>Data.Hangtab</tag>
    <value>False</value>
  </tagvalue>
  <tagvalue>
    <tag>Data.Scale_x.Scale_0.Deviation</tag>
    <value>0</value>
  </tagvalue>
  <tagvalue>
    <tag>Data.Scale_x.Scale_0.DeviationHigh</tag>
    <value>False</value>
  </tagvalue>
  <tagvalue>
    <tag>Data.Scale_x.Scale_0.DeviationLimitHigh</tag>
    <value>0</value>
  </tagvalue>
</tagvalues>'

SELECT X.N.value('(tag/text())[1]','varchar(50)') AS Tag,
       X.N.value('(value/text())[1]','varchar(50)') AS [Value]
FROM @XML.nodes('/tagvalues/tagvalue') X(N);

答案 1 :(得分:1)

尝试XQuery .. .nodes()

select n.value('tag[1]', 'varchar(max)') [Tag],
       n.value('value[1]', 'varchar(max)') [Value]
from @xml.nodes('tagvalues/tagvalue') as p(n)