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 работает, он делает одну вставку сразу за другой. Я думал, что доступные методы должны иметь возможность делать все это вместо циклов, но я не знаю достаточно об их использовании, чтобы делать то, что мне нужно.

Буду признателен за любую помощь или предложения.

Ответы на вопрос(1)

Ваш ответ на вопрос