游标是否真的是“正确”的选择?

时间:2011-11-13 00:18:46

标签: sql-server sqlclr procedural-programming set-based

在处理数据时,有时程序编程是绝对不可避免的。

我目前正致力于优化一些遗留代码。它使用了一个游标,63对IF / ELSE语句和BEGIN / END等等。我曾希望对游标进行逆向工程并使其成为程序过程。现在,我正在解码算法,我意识到。 。 。 ooops ... 是程序性的,因为记录上的每个选择都取决于所有前面记录的过程结果。

所以现在我已经被撕裂......在SQL Server处理(CLR SP,UDF等)中混合程序代码还有其他选择。我非常相信使用正确的工具,所以我倾向于为此制作.NET CLR SP。但是,稍微简化光标会更快,更“容易”,但仍然保持光标。

你们都在想什么?既然我们已经可以通过SQL Server访问.NET模块了,那么使用游标是否合适(在我的opion中它是一个kludge /解决方案)。

2 个答案:

答案 0 :(得分:2)

至少使用SQL服务器,同时具有会话和全局临时表和表变量,我无法想象我会选择使用服务器端游标的场景。并非所有代码都可以基于设置,正如您在yuor遗留应用程序中发现的那样(您确定没有其他选择吗?)但是即使您必须在程序上迭代记录,光标也是最糟糕的选择。

使用表变量,例如, (对于非常大的表集,这种方法的性能开始下降)

 Declare @Pks Table (pk integer primary key not null)
 Insert @pks(pk)
 Select pkcolName from table where ... [here put logic to 
           extract id values for rows you need to iterate over

 -- then put procedural code here ...
 Declare @pk Integer
 While Exists (Select * From @pks) Begin
     Select @pk = Max(pk) From @pks -- assuming you need to work 
                             -- on pk values from highest to lowest
     // Here do work on one record at a time, using value in @pk
     Delete @pks Where pk = @pk
 End

答案 1 :(得分:0)

我只是在客户端/应用服务器上运行C#循环,根据需要调用存储过程。通常,C#更快更容易开发和单元测试,并且它可以比存储过程运行得更快,即使您使用CLR也能执行数据库中的所有操作。