我们有一个存储过程。部分原因是在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
答案 0 :(得分:1)
您可能想要做的是将连接选择到临时表中,然后在光标中使用它。至少那时基表是免费的。
答案 1 :(得分:1)
尝试一个不会保持锁定的静态游标。
答案 2 :(得分:0)
我在一些有助于防止死锁的数据上使用的游标是:
declare cursor YOURCURSORNAME cursor local static read_only forward_only for
但是这对于防止死锁并不总是有效的,因为在查询表时仍然可以锁定表,特别是当使用同时游标查询相同的表时。
@JeffB建议将数据复制到临时表,这将有所帮助。
或者,您可以执行脏读,如果您的方案允许您通过在查询的每个表上使用(nolock),或在查询开头设置以下标志来执行此操作。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;