T-SQL / XML查询为查询中的每一行获取子字段以及整个元素

时间:2016-08-18 18:27:22

标签: sql xml

我有一个像这样的XML字符串:

<Root>
  <Elem>
    <RecTime>2016-08-17 12:30PM</RecTime>
    <Otherfield>blah blah</Otherfield>
    .. other fields ..
  </Elem>
  <Elem>
    <RecTime>2016-08-17 15:30PM</RecTime>
    <Otherfield>more blah</Otherfield>
    .. other fields ..
  </Elem>
</Root>

显然,这描述了元素列表。我想为XML中的每个元素提取记录时间以及整个元素 - 这是因为我想在表中插入记录时间以及整个元素:表可以声明为

DECLARE Table myTable(SampleTime datetime, Data xml)

我尝试了查询

declare @xml xml
set @xml='<Root>
<Elem>
    <RecordTime>2016-08-17 12:30:00PM</RecordTime>
    <Otherfield>2</Otherfield>
    <field2/>
</Elem>
<Elem>
    <RecordTime>2016-08-17 15:30:00PM</RecordTime>
    <Otherfield>3</Otherfield>
    <field2>hello there</field2>
</Elem>
</Root>'

--INSERT INTO myTable
SELECT SampleTime = T.Item.value('RecordTime[1]', 'dateTime'),
            Data = @xml.query('//Root/Elem[1]')
        FROM @xml.nodes('//Root/Elem') T(item)

但是它给了我行,其中包含每行的正确时间,但只包含列表中的第一个元素&#39;整个元素&#39;部分查询:

我用红色圈出了我选择错误元素的证据 我应该如何调整查询以响应每个元素的采样时间以及相应的元素?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

问题出在Data = @xml.query('//Root/Elem[1]')。要实现你想要的东西,请使用类似的东西。

--INSERT INTO myTable
SELECT SampleTime = T.Item.value('RecordTime[1]', 'dateTime'),
            Data = T.item.query('.')
        FROM @xml.nodes('Root/Elem') T(item) --No // before Root. Thanks to Shnugo

这是结果。

2016-08-17 12:30:00.000 <Elem><RecordTime>2016-08-17 12:30:00PM</RecordTime><Otherfield>2</Otherfield><field2 /></Elem>
2016-08-17 15:30:00.000 <Elem><RecordTime>2016-08-17 15:30:00PM</RecordTime><Otherfield>3</Otherfield><field2>hello there</field2></Elem>