Sql server 诅咒是真正的&引用;对",;选择?

Sql server 诅咒是真正的&引用;对",;选择?,sql-server,sqlclr,procedural-programming,set-based,Sql Server,Sqlclr,Procedural Programming,Set Based,在处理数据时,有时程序编程是绝对不可避免的 我目前正在优化一些遗留代码。它使用一个游标,63对IF/ELSE语句和BEGIN/END等。我曾希望对游标进行反向工程,使其成为一个过程。现在我在解码算法的最后,我意识到。OOPS…它必须是程序性的,因为对一个记录所做的每个选择都取决于对前面所有记录的处理结果 所以,现在我被撕裂了……将过程代码与SQL Server处理(CLR SP、UDF等)混合在一起还有其他选择。我非常相信在工作中使用正确的工具,所以我倾向于为此制作一个.NET CLR SP。但

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

我目前正在优化一些遗留代码。它使用一个游标,63对
IF
/
ELSE
语句和
BEGIN
/
END
等。我曾希望对游标进行反向工程,使其成为一个过程。现在我在解码算法的最后,我意识到。OOPS…它必须是程序性的,因为对一个记录所做的每个选择都取决于对前面所有记录的处理结果

所以,现在我被撕裂了……将过程代码与SQL Server处理(CLR SP、UDF等)混合在一起还有其他选择。我非常相信在工作中使用正确的工具,所以我倾向于为此制作一个.NET CLR SP。但是,简化一点光标,但仍然保留光标,这将更快更“容易”


你们都怎么想?现在我们有了可以通过SQL Server访问的.NET模块,是否再适合使用游标(在我看来,游标一开始就是一个乱七八糟的东西)。

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

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


我只需要在客户机/应用服务器上运行一个C#循环,根据需要调用存储过程。通常,C#的开发和单元测试要快得多、容易得多,而且它可以比存储过程运行得更快,即使您使用CLR,存储过程也可以处理数据库中的所有事情。

除了游标之外,您还建议对过程进行迭代吗?不,这必须是程序性的。我想了很多,把它拆开了,没有办法基于集合来做。我不完全确定,但我认为唯一可以比较好的游标类型是前瞻性只读游标,可以说,它根本不是服务器端游标,只是上面代码的语法表示。。。没有直接做这件事给你的控制。
 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