2011-12-16 61 views
1

需要使用游标从另一个存储采购和更新,只有选择的值SQL服务器游标不工作

更新的值我有以下几点:

DECLARE upd_cursor CURSOR FOR 
SELECT * FROM Terr 
WHERE Text = "RightT" ; 

OPEN upd_cursor; 

-- Perform the first fetch. 
FETCH NEXT FROM upd_cursor; 

-- Check @@FETCH_STATUS to see if there are any more rows to fetch. 
WHILE @@FETCH_STATUS = 0 
BEGIN 

exec usp_Gent @valback OUTPUT; 
update Terr 
set Text = @valback 

FETCH NEXT FROM upd_cursor; 
END 

CLOSE upd_cursor; 
DEALLOCATE upd_cursor; 
GO 

在我的情况下,更新所有领域在桌子里。我在做什么错了

+1

您没有使用游标的更新语法。每次循环时,您的代码都会更新Terr表中的所有行。话虽如此。同意下面。在这种情况下没有理由使用游标。用Upadate ...更好......其中“ – Anon246 2011-12-16 22:44:58

+0

我不知道,你想达到什么目的? – 2011-12-16 23:33:23

回答

1

如果你真的想要做逐行更新,你可以使用CURRENT OF语法。如果您对存储过程的调用每个都返回不同的结果,情况就是这样。

例如

 update Terr 
    set Text = @valback 
    WHERE CURRENT OF upd_cursor 
3
update Terr 
set Text = @valback 

您在此声明中未设置WHERE条件。

另外,你为什么使用游标?

+4

+1正确答案+1用于提问使用游标。我不能+2我可以吗? – Twelfth 2011-12-16 22:41:10

3

您的update声明中没有where子句。

更一般地,你应该使用一个update条款要做到这一点,而不是光标:

exec usp_Gent @valback OUTPUT; 
update Terr set 
    Text = @valback 
where 
    Text = 'RightT'; 

除非你usp_Gent做,我失去了一些东西。

你想要一个单独的子句而不是做一个的原因是每一行是因为SQL认为集合更好。每个update你有开销 - 它打开一个事务,记录它正在做什么,然后提交该事务。如果你必须做成千上万个,这非常慢。你真正想要做的只是一次更新数千行 - 这是数据库用关系代数做的事情,他们真的很擅长这样做。想一组,而不是按顺序。

+2

+1对于基于集合的解释 – Anon246 2011-12-16 22:46:16