SQL Server游标不工作

SQL Server游标不工作,sql,sql-server,tsql,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.

需要光标从另一个存储库更新值,并且只更新选定的值

我有以下资料:

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
在我的例子中,它会更新表中的所有字段。我做错了什么

update Terr  
set Text = @valback
您没有在此语句中设置
WHERE
条件

还有,为什么要使用游标

您没有在此语句中设置
WHERE
条件


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

update
语句中没有where子句

更一般地说,您应该使用一个
update
子句来执行此操作,而不是使用游标:

exec usp_Gent @valback OUTPUT;
update Terr set
    Text = @valback
where
    Text = 'RightT';
除非你
usp\u Gent
正在做我错过的事情


您希望使用单个子句而不是为每一行使用一个子句的原因是,SQL在集合中思考得更好。每个
更新都有开销——它打开一个事务,记录它正在做什么,然后提交该事务。如果你不得不做上千次这样的事情,那么这是非常缓慢的。您真正想做的是一次更新数千行——这就是数据库使用关系代数所做的,它们非常非常擅长这样做。集中思考,而不是按顺序思考。

您的
update
语句中没有where子句

更一般地说,您应该使用一个
update
子句来执行此操作,而不是使用游标:

exec usp_Gent @valback OUTPUT;
update Terr set
    Text = @valback
where
    Text = 'RightT';
除非你
usp\u Gent
正在做我错过的事情

您希望使用单个子句而不是为每一行使用一个子句的原因是,SQL在集合中思考得更好。每个
更新都有开销——它打开一个事务,记录它正在做什么,然后提交该事务。如果你不得不做上千次这样的事情,那么这是非常缓慢的。您真正想做的是一次更新数千行——这就是数据库使用关系代数所做的,它们非常非常擅长这样做。集中思考,而不是按顺序思考。

如果你真的想逐行更新,你可以使用
CURRENT OF
语法。如果对存储过程的调用在每个存储过程上返回不同的结果,则会出现这种情况

e、 g

如果您真的想逐行更新,可以使用
CURRENT OF
语法。如果对存储过程的调用在每个存储过程上返回不同的结果,则会出现这种情况

e、 g


+1表示正确答案+1表示使用光标提问。我不能+2我能吗?+1表示正确答案+1表示提问使用光标。我不能+2可以吗?你没有对游标使用更新语法。每次循环时,代码都会更新Terr表中的所有行。话虽如此。同意下面的观点。在这种情况下,没有理由使用光标。最好有一个Upadate。。。where“我不知道。你想实现什么?你没有对游标使用更新语法。你的代码将在每次循环时更新Terr表中的所有行。也就是说。同意下面的说法。在这种情况下没有理由使用游标。最好使用Upadate…where“我不知道”。你想达到什么目的?同上。除非usp\u Gent每次为更新的每一行返回唯一的值,否则这是最优雅、最高效的解决方案。同上。除非usp_Gent每次为更新的每一行返回唯一的值,否则这是最优雅、最高效的解决方案。我的目标是遍历记录,我有一个存储过程生成一个值,在更新过程中分配该值。有更好、更有效的方法吗?@NatePet好吧,您可以编写一个SP,它可以执行基于集合的检索并一次性更新表。另一个选项是将SP重写为函数并使用交叉应用(SQL 2005及更高版本)。但是,函数的功能有一些限制。我的目标是遍历记录,我有一个存储过程,可以生成一个值,并在更新过程中分配该值。有更好、更有效的方法吗?@NatePet好吧,您可以编写一个SP,它可以执行基于集合的检索并一次性更新表。另一个选项是将SP重写为函数并使用交叉应用(SQL 2005及更高版本)。然而,对于什么是函数存在限制