SQL 2012 - перебирать список XML (лучшая альтернатива циклу WHILE)
Использование SQL 2012 и получение XML, передаваемого в хранимую процедуру, которая должна принять эти данные и записать строку в таблицу для каждого из элементов в разделе XML, который передается в хранимую процедуру. XML выглядит так:
<MyXML>
<MyMsg>My Text Message</MyMsg>
<MsgTime>2013-09-25 10:52:37.098</MsgTime>
<SendToList>
<SendTo>John</SendTo>
<SendTo>James</SendTo>
<SendTo>Rob</SendTo>
<SendTo>Pete</SendTo>
<SendTo>Sam</SendTo>
</SendToList>
</MyXML>
Вывод хранимой процедуры должен состоять из 5 строк, вставляемых в таблицу (по одной на каждуюSendTo
выше), и каждый имеет одинаковое значение вMyMsg
а такжеMsgTime
поля в этой таблице.
Я могу получить количествоSendTo
и может получить XMLSendToList
но я не знаю, как пройти через это, чтобы сделать вставки.
Я могу использовать следующий SQL, чтобы получить то, что находится в XML.
SELECT
x.value('(/MyXML/MyMsg)[1]', 'VARCHAR(1024)'),
x.value('(/MyXML/MsgTime)[1]', 'DATETIME'),
@max = x.query('<e> { count(/MyXML/SendToList/SendTo) } </e>').value('e[1]','int'),
@mlst = x.query('/MyXML/SendTo')
FROM @XML_In.nodes('//MyXML') i(x)
В настоящее время я использую переменные иWHILE
перебирать элементы в SendToList, но я знаю, что должен быть лучший способ.
SELECT @msgTo= @XML_In.value('(/MyXML/SendToList/SendTo[position()=sql:variable("@cnt")])[1]','VARCHAR(100)')
Вышесказанное возвращает мне значение каждого элемента в SendToList.
Если я выберу переменную @mlst, я смогу увидеть структуру XML, которую мне нужно пройти по циклу.
<SendToList>
<SendTo>John</SendTo>
<SendTo>James</SendTo>
<SendTo>Rob</SendTo>
<SendTo>Pete</SendTo>
<SendTo>Sam</SendTo>
</SendToList>
ХотяWHILE
работает, он делает одну вставку сразу за другой. Я думал, что доступные методы должны иметь возможность делать все это вместо циклов, но я не знаю достаточно об их использовании, чтобы делать то, что мне нужно.
Буду признателен за любую помощь или предложения.