需要游标更新其他存储采购中的值并仅更新选定值
我有以下内容:
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
就我而言,它会更新表中的所有字段。我做错了什么
答案 0 :(得分:3)
update Terr
set Text = @valback
您未在此声明中设置WHERE
条件。
另外,你为什么要使用游标?
答案 1 :(得分:3)
您的update
声明中没有where子句。
更一般地说,您应该使用单个update
子句而不是游标:
exec usp_Gent @valback OUTPUT;
update Terr set
Text = @valback
where
Text = 'RightT';
除非你usp_Gent
做了我缺少的事情。
您希望单个子句而不是为每行执行一个的原因是因为SQL在集合中认为更好。您拥有的每个update
都有开销 - 它会打开一个事务,记录它正在做的事情,然后提交该事务。如果你不得不做成千上万的话,这个速度非常慢。你真正想要做的就是一次更新数千行 - 这就是数据库用关系代数做的事情,他们真的非常擅长这样做。思考,不是按顺序。
答案 2 :(得分:1)
如果确实希望逐行更新,则可以使用CURRENT OF
语法。如果对存储过程的调用在每个上都返回了不同的结果,则会出现这种情况。
e.g。
update Terr
set Text = @valback
WHERE CURRENT OF upd_cursor