SQL服务器游标不工作
需要使用游标从另一个存储采购和更新,只有选择的值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
在我的情况下,更新所有领域在桌子里。我在做什么错了
如果你真的想要做逐行更新,你可以使用CURRENT OF
语法。如果您对存储过程的调用每个都返回不同的结果,情况就是这样。
例如
update Terr
set Text = @valback
WHERE CURRENT OF upd_cursor
update Terr
set Text = @valback
您在此声明中未设置WHERE
条件。
另外,你为什么使用游标?
+1正确答案+1用于提问使用游标。我不能+2我可以吗? – Twelfth 2011-12-16 22:41:10
您的update
声明中没有where子句。
更一般地,你应该使用一个update
条款要做到这一点,而不是光标:
exec usp_Gent @valback OUTPUT;
update Terr set
Text = @valback
where
Text = 'RightT';
除非你usp_Gent
做,我失去了一些东西。
你想要一个单独的子句而不是做一个的原因是每一行是因为SQL认为集合更好。每个update
你有开销 - 它打开一个事务,记录它正在做什么,然后提交该事务。如果你必须做成千上万个,这非常慢。你真正想要做的只是一次更新数千行 - 这是数据库用关系代数做的事情,他们真的很擅长这样做。想一组,而不是按顺序。
+1对于基于集合的解释 – Anon246 2011-12-16 22:46:16
您没有使用游标的更新语法。每次循环时,您的代码都会更新Terr表中的所有行。话虽如此。同意下面。在这种情况下没有理由使用游标。用Upadate ...更好......其中“ – Anon246 2011-12-16 22:44:58
我不知道,你想达到什么目的? – 2011-12-16 23:33:23