0

有时,在处理数据时,过程式编程是绝对无法避免的。

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

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

大家怎么看?既然我们可以通过 SQL Server 访问 .NET 模块,那么使用游标是否合适(在我看来,这从一开始就是一个杂物/解决方法)。

4

2 回答 2

2

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

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

 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
于 2011-11-13T00:38:19.687 回答
0

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

于 2011-11-13T03:45:37.580 回答