1

我们有一个存储过程。其中一部分是在涉及 6 个具有内部连接的不同表的 select 语句上执行游标。

在游标主体中,我们使用来自游标的参数执行 3 个其他存储过程。

在这种情况下有没有办法摆脱光标?

谢谢大家!

  DECLARE myCursor CURSOR FOR
              SELECT x,y,z
              FROM   a
                     INNER JOIN .....
                     INNER JOIN .....
                     INNER JOIN .....
                     INNER JOIN .....
                     INNER JOIN .....

            OPEN myCursor

            FETCH NEXT ...

            WHILE @@FETCH_STATUS = 0
              BEGIN

                    EXECUTE xy @cursor_variable

                    EXECUTE yz @cursor_variable

                    EXECUTE abc @cursor_variable

                  FETCH NEXT FROM myCursor INTO ...
              END

            CLOSE myCursor

            DEALLOCATE myCursor
        END
4

3 回答 3

1

尝试使用不会锁定的静态游标。

于 2013-05-18T05:03:27.730 回答
1

您可能想要做的是将您的联接选择到临时表中,然后在光标中使用它。至少那时基表将是免费的。

于 2013-05-17T16:36:16.807 回答
0

我在一些数据上使用的有助于防止死锁的游标是:

declare cursor YOURCURSORNAME cursor local static read_only forward_only for  

但这在防止死锁方面并不总是有效,因为在查询表时仍然可以锁定表,特别是当同时游标查询使用相同的表时。

@JeffB 建议将您的数据复制到临时表中,这将有所帮助。

或者,如果您的方案允许您通过在查询的每个表上使用 (nolock) 或在查询开始时设置以下标志来执行脏读,您也可以执行脏读。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
于 2016-12-02T08:30:09.260 回答