C# 从存储过程-sql while循环调用多个存储过程

C# 从存储过程-sql while循环调用多个存储过程,c#,xml,wcf,stored-procedures,sql-server-2012,C#,Xml,Wcf,Stored Procedures,Sql Server 2012,我经常听说while循环和游标一样糟糕,我不相信这是真的。从性能角度来看,从C调用多个存储过程更好,还是允许存储过程解析XML数据并以循环方式调用过程更好?在SQL中调用未知数量的存储过程是否有比循环更好的方法 让我解释一下 我必须设计并实现一个供应商消息传递系统。有一家第三方公司向来自发送方的接收方发送XML消息。我的公司在任何特定时间都可能是发件人或收件人 我提出了一种使用SQLWhile循环来运行存储过程的设计,但我担心它在面对大量循环时可能会表现不佳 基本思想是: 发送方->第三方消息系

我经常听说while循环和游标一样糟糕,我不相信这是真的。从性能角度来看,从C调用多个存储过程更好,还是允许存储过程解析XML数据并以循环方式调用过程更好?在SQL中调用未知数量的存储过程是否有比循环更好的方法

让我解释一下

我必须设计并实现一个供应商消息传递系统。有一家第三方公司向来自发送方的接收方发送XML消息。我的公司在任何特定时间都可能是发件人或收件人

我提出了一种使用SQLWhile循环来运行存储过程的设计,但我担心它在面对大量循环时可能会表现不佳

基本思想是: 发送方->第三方消息系统->接收方

当我的公司是接收者时,我的问题可能会发生:

发件人向第三方公司发送邮件 第三方公司向我的公司发送消息 WCF服务收到来自第三方公司的请求 调用存储过程,传递要解析的接收消息的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>

我害怕把它投入生产,然后发现它运行得太慢了。有人有什么建议吗?

我的建议是继续使用C来解析xml,并根据需要从dotnet端调用存储过程,只要您保持sql的简洁性。显然,我并不完全熟悉您的情况,但根据我的经验,调试sql存储的进程是很困难的,尤其是当它们在逻辑/处理方面很繁重时,就像您正在做的那样,即使您使用的是游标/循环。在像c这样的环境中,控件更细粒度,您可以在处理过程中放置断点,观察变量的值或内存中的xml节点,并捕获更广泛的错误,这在从第三方接收文件时非常有用。此外,虽然您可能认为sql在性能上与dot net一样优秀,但它不是中间件,它通常在后端为您提供最佳服务。通常在许多组织中,sql server在后端有足够的工作要做,而且,在将来,如果您发现您对sql server的要求太多,并且它会开始在您身上表现出奇怪的行为,您可能会发现您的sql server负担过重。最后,就性能而言,我认为好处大于额外的行程时间,如果保持sql简单并编译为存储过程,那么无论如何都应该减少额外的行程时间,如果将其放在生产服务器上,则应该有足够的内存。至少,如果出于性能原因不得不这样做,我会倾向于C/dotnet,并依靠sql server尽可能少地进行处理,以达到平衡。

对于高达1MB的xml,我不会在存储过程中对其进行分解。您不会说xml中有多少行

与逐行发送相比,您将获得更好的性能

如果你有超过1 MB,考虑一个GOLDE锁方法。不要一个接一个地发送,也不要全部发送,而是使用一个外部c进程将xml分解成更小的部分。例如:一个有100500行的文件,一次发送10000行,发送11次

你可以用goldie locks方法玩数字游戏

我会用C验证您的xml,然后我会将它作为我称之为perfectXml的东西发送到sql server,然后将它分解,也许是放到一个临时表中,然后从那里插入。同样,这是关键,xml应该是完美的,因为您没有在tsql中对其运行检查以及if和this或that语句


一排一排地折磨着鸟儿。

你的问题是6。您的存储过程不是基于集合的。所以你需要重做这个过程……或者像你现在做的那样做糟糕的循环。另一个想法是在C中跨越多个线程/任务,并以这种方式一次发送一个线程/任务。寻找c parallel foreach…..但是请记住,如果您的数据可能重叠,您可能会遇到竞争问题。出于好奇,有没有一种方法可以以基于集合的方式调用SQL中的存储过程?发送xml并将其分解。谢谢-这就是我要寻找的。与在SQL中引发错误相比,我在处理错误和从C中划分任务方面更为自如。我的计划是使用输出参数XML或varchar类型并处理来自C的输出,但是在详细考虑了为什么我打算这样做之后,我意识到我应该从C来完成这一切。
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