使用 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 行(每行 1 行)SendTo
上面),并且每个都具有相同的值MyMsg
and 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
有效,它在另一个插入之后立即执行一个插入。我认为可用的方法应该能够完成这一切而不是循环,但我对使用它们来完成我需要做的事情了解不够。
将不胜感激任何帮助或建议。