我有一个像这样的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;部分查询:
我用红色圈出了我选择错误元素的证据 我应该如何调整查询以响应每个元素的采样时间以及相应的元素?
感谢您的帮助!
答案 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>