Sql server 2008 如何消除此游标(导致死锁)
我们有一个存储过程。它的一部分是在select语句上执行游标,该语句涉及6个具有内部联接的不同表 在游标体中,我们使用游标中的参数执行另外3个存储过程 在这种情况下,有没有办法去掉光标 谢谢大家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 ..
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”返回多少行,以便更好地了解情况。