Sql server 2008 如何消除此游标(导致死锁)

Sql server 2008 如何消除此游标(导致死锁),sql-server-2008,cursor,deadlock,Sql Server 2008,Cursor,Deadlock,我们有一个存储过程。它的一部分是在select语句上执行游标,该语句涉及6个具有内部联接的不同表 在游标体中,我们使用游标中的参数执行另外3个存储过程 在这种情况下,有没有办法去掉光标 谢谢大家 DECLARE myCursor CURSOR FOR SELECT x,y,z FROM a INNER JOIN ..... INNER JOIN ..

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

在游标体中,我们使用游标中的参数执行另外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

您可能需要做的事情是选择一个临时表中的联接,然后在游标中使用它。至少这样,基础表将是空闲的。

尝试一个静态光标,它不会保持锁定。

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

declare cursor YOURCURSORNAME cursor local static read_only forward_only for  
但这在防止死锁方面并不总是有效的,因为在查询表时,表仍然可以被锁定,特别是当同时使用游标查询相同的表时

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

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

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

为什么要投否决票?我不介意一个解释,或者更好的回答。对于清晰易读的代码+1。可以使用
动态SQL
。我需要知道从“6-Table-Join”返回多少行,以便更好地了解情况。