SQL Server CURSOR无法正常工作

时间:2011-12-16 22:31:25

标签: sql sql-server tsql

需要游标更新其他存储采购中的值并仅更新选定值

我有以下内容:

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

就我而言,它会更新表中的所有字段。我做错了什么

3 个答案:

答案 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