Sql server 2005 基于另一个表的游标中的值对一个表进行SQL更新

Sql server 2005 基于另一个表的游标中的值对一个表进行SQL更新,sql-server-2005,cursor,Sql Server 2005,Cursor,我额头上墙上的记号变得太红了,所以我听到了 我有两个表,需要根据另一个表的选择条件更新其中一个表的值。我知道我可以使用一个where-exists更新,但是我有很多更新要循环。因此,我尝试使用游标将一个表中的值放入变量中,然后使用这些变量对另一个表进行更新。没有发生错误,但也没有更新。当我将代码更改为Select语句时,它会正确显示信息,但更新不起作用。我不确定它是否基于使用for update创建游标,因为我正在更新的表与游标从中选择记录的表不同。下面是我的问题。任何人请告诉我我可能做错了什么

我额头上墙上的记号变得太红了,所以我听到了

我有两个表,需要根据另一个表的选择条件更新其中一个表的值。我知道我可以使用一个where-exists更新,但是我有很多更新要循环。因此,我尝试使用游标将一个表中的值放入变量中,然后使用这些变量对另一个表进行更新。没有发生错误,但也没有更新。当我将代码更改为Select语句时,它会正确显示信息,但更新不起作用。我不确定它是否基于使用for update创建游标,因为我正在更新的表与游标从中选择记录的表不同。下面是我的问题。任何人请告诉我我可能做错了什么。谢谢

    DECLARE @so VARCHAR(50)
DECLARE @line VARCHAR(50)
DECLARE @pdate DATETIME
DECLARE @reason1 VARCHAR(50)
DECLARE @reason2 VARCHAR(50)
DECLARE @area VARCHAR(50)

DECLARE mycursor CURSOR FOR 
SELECT [bp_so_number],[bp_line],[bp_production_date],[bp_reason1],[bp_reason2],[bp_area]
 FROM [Workflow].[dbo].[v_OTD_PostSrc]

 OPEN mycursor
 FETCH NEXT FROM mycursor
 INTO @so, @line, @pdate, @reason1, @reason2, @area

 WHILE @@FETCH_STATUS = 0
 BEGIN
    FETCH NEXT FROM mycursor
    INTO @so, @line, @pdate, @reason1, @reason2, @area;
    UPDATE otd_data SET reason1=@reason1, reason2=@reason2, area=@area 
    WHERE [Order Number]=@so AND LI=@line AND [Schedule Date]=@pdate AND [Qty Open]>0
    --SELECT * FROM otd_data WHERE [Order Number]=@so AND LI=@line AND [Schedule Date]=@pdate
 END

CLOSE mycursor
DEALLOCATE mycursor

就像我说的。没有错误,但也没有表更新…:-

在第一次更新之前,需要进行两次获取。尝试将循环重新构造为:

DECLARE @so VARCHAR(50)
DECLARE @line VARCHAR(50)
DECLARE @pdate DATETIME
DECLARE @reason1 VARCHAR(50)
DECLARE @reason2 VARCHAR(50)
DECLARE @area VARCHAR(50)

DECLARE mycursor CURSOR LOCAL FAST_FORWARD FOR 
SELECT [bp_so_number],[bp_line],[bp_production_date],[bp_reason1],[bp_reason2],[bp_area]
 FROM [Workflow].[dbo].[v_OTD_PostSrc]

 OPEN mycursor
 -- Always true
 WHILE 1 = 1
 BEGIN
    -- Get next record from cursor
    FETCH NEXT FROM mycursor
               INTO @so, @line, @pdate, @reason1, @reason2, @area;
    -- If there was a record @@fetch_status will be 0; 
    -- if not, or in case of an error, break the loop
    IF @@FETCH_STATUS <> 0
       break
    UPDATE otd_data SET reason1=@reason1, reason2=@reason2, area=@area 
    WHERE [Order Number]=@so AND LI=@line AND [Schedule Date]=@pdate AND [Qty Open]>0
    --SELECT * FROM otd_data WHERE [Order Number]=@so AND LI=@line AND [Schedule Date]=@pdate
 END

CLOSE mycursor
DEALLOCATE mycursor
我已经为光标添加了选项。关于快进的文件:

指定具有性能的仅向前、只读游标 已启用优化


好的,那很有帮助,谢谢你!我还必须在date字段中使用DATEPART,因为在@pdate中它是在2012年5月14日通过的