【问题标题】:Read multiple lines from xml column to table从 xml 列读取多行到表
【发布时间】:2018-09-18 07:57:35
【问题描述】:

我正在努力从存储为 xml 列的测量中读取数据。我的 xml 文件如下所示:

<Data t0="2018-09-18T07:43:11.882+01:00" dt="2.003338853E-5">
  <Measurement>
    <Value>2.075</Value>
    <Value>2.175</Value>
    <Value>2.275</Value>
    <Value>2.325</Value>
    <Value>2.425</Value>
    ...
  </Measurement>
</Data>

我需要一个包含值的表格。

我已经尝试过的是:

SELECT      CONVERT(varchar(max),c.query('data(Value)')) as XMLValues
FROM        [dbo].[T_Measurement] as t1
                CROSS APPLY Measurement.nodes('/Data/Measurement') x(c)

这会创建一个带有空格分隔值的结果 xml 字段。但是如何创建一个生成表的查询呢?

问候,丹尼尔

【问题讨论】:

    标签: sql sql-server xml tsql


    【解决方案1】:

    您可以使用query() 提取值,然后使用value 将它们转换为数字类型:

    declare @tmp table (Measurement xml)
    
    insert into @tmp 
    select 
    '<Data t0="2018-09-18T07:43:11.882+01:00" dt="2.003338853E-5"> 
      <Measurement>          
        <Value>2.075</Value> 
        <Value>2.175</Value> 
        <Value>2.275</Value> 
        <Value>2.325</Value> 
        <Value>2.425</Value> 
      </Measurement> 
    </Data>'
    
    SELECT  
        Tbl.Col.value('.','decimal(18,3)') as XMLValues
    FROM @tmp as t1
        CROSS APPLY Measurement.nodes('/Data/Measurement/Value') Tbl(Col)
    

    结果:

    如果您在单个文件中有多个测量值(例如具有标识每个测量值的属性):

    DECLARE @tmp TABLE (Measurement XML)
    
    INSERT INTO @tmp
    SELECT '<Data t0="2018-09-18T07:43:11.882+01:00" dt="2.003338853E-5"> 
      <Measurement setId="1">          
        <Value>1.075</Value> 
        <Value>1.175</Value> 
        <Value>1.275</Value> 
        <Value>1.325</Value> 
        <Value>1.425</Value> 
      </Measurement> 
      <Measurement setId="2">          
        <Value>2.076</Value> 
        <Value>2.176</Value> 
        <Value>2.276</Value> 
        <Value>2.326</Value> 
        <Value>2.426</Value> 
      </Measurement> 
    </Data>'
    
    SELECT 
        Tbl.Col.value('../@setId', 'int')   as setId,
        Tbl.Col.value('.', 'decimal(18,3)') as XMLValues 
    FROM @tmp AS t1
    CROSS APPLY Measurement.nodes('/Data/Measurement/Value') Tbl(Col)
    

    结果:

    【讨论】:

    • 另外:对于一组以上的测量,查询看起来如何?例如数据不仅包含数据集“Measurement”,还包含名为“Measurement2”的数据集?
    • @Daniel 请查看更新后的答案。您可以使用../ 上一级并读取父标签的属性以识别每个测量值
    猜你喜欢
    • 2015-07-18
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2018-06-07
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多