2

壁からの額のマークが赤くなりすぎているので、投稿します....

2 つのテーブルがあり、別の選択基準に基づいて一方の値を更新する必要があります。「存在する場所」で更新を使用できることはわかっていますが、ループする更新がたくさんあります。そのため、カーソルを使用して 1 つのテーブルの値を変数に入れ、これらの変数を使用して他のテーブルで更新を使用しようとしています。エラーは発生していませんが、更新もありません。コードを Select ステートメントに変更すると、情報は正しく表示されますが、更新は機能しません。「更新用」を使用してカーソルを作成することに基づいているかどうかはわかりません。更新しているテーブルは、カーソルがレコードを選択しているテーブルと同じではないためです。以下は私の質問です。誰でも私が間違っているかもしれないことを教えてください。ありがとう!

    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

私が言ったように。エラーはありませんが、テーブルの更新もありません... :-(

4

1 に答える 1

2

最初の更新の前に 2 つのフェッチを行います。次のようにループを再構築してみてください。

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

カーソルにLOCAL および FAST_FORWARDオプションを追加しました。FAST_FORWARD に関するドキュメント:

パフォーマンスの最適化が有効な FORWARD_ONLY、READ_ONLY カーソルを指定します。

于 2012-05-14T09:56:49.807 に答える