我经常听说while循环和游标一样糟糕,我不认为这是真的。 从性能的角度来看,从C#调用多个存储过程还是允许存储过程以循环方式解析XML数据和调用过程会更好吗?有没有更好的方法来调用SQL中未知数量的存储过程而不是循环?从存储过程调用多个存储过程 - sql while循环
让我解释一下
我要设计和实现一个供应商的邮件系统。有一家第三方公司将XML消息发送给源自发件人的收件人。我的公司可能在任何时候都是发件人或收件人。
我想出了一个使用SQL while循环来运行存储过程的设计,但是我担心它在面对大量循环时可能无法正常运行。
的基本思路是: 发件人 - >第三方(信息系统) - >接收器
当我的公司是接收器,可能会出现我的问题:
- 发送者发送消息至第三方公司
- 第三方公司发送邮件到我公司
- WCF服务收到来自第三方公司要求
- 一个存储proced URE被调用时,使消息的XML接收要被解析
- 这个存储过程解析XML和在XML发现消息
- While循环经过每一个消息,并调用存储过程来更新信息,传递的ID消息的实例。
消息XML是这样的:
<envelope>
<to></to>
<from></from>
...
<messages>
<message>
<id></id>
...
<params>
<param>
<Name></Name>
<Value></Value>
<param>
...
</params>
</message>
...
</messages>
</envelope>
可以接收,或在XML的每个传输发送一个或多个消息。可能会一次收到多个消息。处理发送和接收XML的第三方公司的要求是我们总是回应成功或失败。我们有一个60秒的超时时间窗口来回应。由于这些限制,我自然害怕我无法在时间限制内完成所有需要处理的事情,从而导致超时。
因此,如果我在一次传输中找到消息1,2和3,我将不得不运行存储过程1,2和3.我有一个临时表充满消息ID和存储过程来运行。
所以While循环将基本(没有检查这部分的效力,只是自由交给它,因为我没有SP方便)
While select count(*) from #temptable > 0
begin
select top 1 @idMessage = idMessage, @spToRun = spToRun from #temptable
exec @spToRun @idMessage
delete from #temptable where idMessage = @idMessage
select @idMessage = null, @spToRun = null
end
我怕把这个投入生产,然后发现它运行得很慢,太慢了。有人有建议吗?
您的问题是#6。您有一个不基于设置的存储过程。所以你需要重做这个过程.....或者像你一样做(糟糕的)循环。另一个想法是跨越C#中的多个线程/任务,并以这种方式一次发送一个线程/任务。寻找“C#平行foreach”.....但请记住,如果你的数据可能重叠,你可能会遇到种族问题。 – granadaCoder
出于好奇,有没有一种方法可以以基于集合的方式在SQL中调用存储过程? – Shockwave
发送到XML并粉碎它。 – granadaCoder