0

在你说这与不使用游标的每一行的 SQL 调用存储过程相同之前,让我澄清一下我的问题:

存储过程确实有副作用。事实上,这都是关于这些副作用的,因为每次调用的结果都会影响进一步的处理。

可以这样想:表包含规则定义,而 proc 按字面意思执行这些规则 RBAR,对另一个表进行更改。

在这些情况下,我看不出如何进行设置操作,由于副作用,可能无法使用 CROSS APPLY,但也不需要它,因为我并没有真正加入规则表并获得任何结果。

如果解决方案真的是 RBAR,我还是应该尽量避免使用 CURSOR 吗?将 WHILE 与 READ TOP 1 WHERE Key > @Key 一起使用是更好的解决方案吗?为什么?

我搜索得越多,我就越得出这样的结论:fast_forward read_only cursor 是最简单和最快的解决方案。

4

2 回答 2

2

游标本质上是坏的

不会。游标很容易被误用,并且往往会被 SQL 新手所使用,因为他们来自过程背景,甚至没有听说过“基于集合”。光标有它们的位置,如果您评估了可用的方法并得出结论认为光标很合适,我会说使用一个。

使用WHILE循环来隐藏你真正在做的是使用光标的事实也是我不推荐的。

最后一点 - 你提到fast_forwardread_only- 但另一个建议是local- 这样,如果出现问题,至少当你退出游标运行的任何范围时,游标会被清理 - 而不是在连接的生命周期内持续存在.

于 2013-05-21T06:26:08.880 回答
0
        --- create one temp table using temprory talbe
        declare @test_Table  table (id int, num int, name varchar(50))
        --- fetch all data from your table to temp talbe
        insert into @test_Table (id,num,name)
        select id,number,name from TESTNUMBERS

        ----select * from TESTNUMBERS

        declare @count int
        declare @id int
        set @count=(select COUNT(1) from @test_Table)
        --- create while loop to work on particular row 
        while (@count <>0)
        begin
        set id=(select top 1 id from @test_Table)
        ---- do you task wiht that row and call your stored procedure on this row
        ---then delete that row form temp table variable 
        delete from @test_Table where id=@id
        --- decarease count to maintain loop 
        set @count=@count-1
        end

您可以使用这种类型的循环来处理每一行而不使用游标。

脚步 :

  1. 在临时表中存储数据

  2. 获取所有行的计数

  3. 在循环中从临时表中获取前 1 行

  4. 在该行完成所有任务

  5. den 从临时表中删除该行

  6. 将计数减 1

6 如果有帮助,那就尽情享受吧......

于 2013-05-21T05:23:02.787 回答