2013-08-30 33 views
1

我有一個SQL遊標,我遇到了問題。當我從光標內刪除IF @debug = 1語句時,只有FETCH中的第一條記錄會更新,但如果我離開IF @debug = 1,所有必需的記錄都會更新。任何關於爲什麼會發生這種情況的想法,我知道我的光標很可能有問題嗎?代碼如下:SQL遊標內的代碼將只執行第一個FETCH

DECLARE Verify_Shipment_Cur CURSOR LOCAL FAST_FORWARD READ_ONLY FOR 
    SELECT DISTINCT lpd_shipment_id, lpd_po_number, lpd_customer_id, lpd_sku, lpd_lottable01, lpd_lottable02, lpd_lottable03, lpd_putaway_zone, lpd_pdt 
     FROM PO_DETAIL01(NOLOCK) 
    WHERE lpd_shipment_id = @i_SHIPMENT_ID 
      AND lpd_po_number = @i_POKEY 
      AND lpd_customer_id = @i_CUSTOMER_ID 
      AND lpd_status = @AvailableStatus 

OPEN Verify_Shipment_Cur 
    WHILE @ShipmentSKUCount >= @ShipmentSKUCountCur 
     BEGIN 
      FETCH NEXT FROM Verify_Shipment_Cur INTO @ShipmentID, @POKey, @CustomerID, @SKU, @Lottable01, @Lottable02, @Lottable03, @PutawayZone, @PDT 

      IF EXISTS(SELECT 1 FROM PO_DETAIL(NOLOCK) WHERE pd_asn_number = @i_SHIPMENT_ID AND pd_po_number = @i_POKEY 
         AND pd_sku = @SKU AND pd_type = @ShmtType AND pd_ordered_qty <> pd_received_qty) 
       BEGIN 
        UPDATE PO_DETAIL 
         SET pd_adjusted_qty = pd_ordered_qty - pd_received_qty 
        WHERE pd_asn_number = @i_SHIPMENT_ID 
         AND pd_po_number = @i_POKEY 
         AND pd_sku = @SKU 
         AND pd_type = @ShmtType 
       END 

      UPDATE PO_DETAIL 
       SET pd_lottable01 = @Lottable01 
        , pd_lottable02 = @Lottable02 
        , pd_lottable03 = @Lottable03 
        , pd_lottable04 = '' 
        , pd_lottable05 = @Date 
        , pd_putaway_zone = @PutawayZone 
        , pd_pdt = @PDT 
        , pd_status = @VerifiedStatus 
      WHERE pd_asn_number = @i_SHIPMENT_ID 
         AND pd_po_number = @i_POKEY 
         AND pd_sku = @SKU 
         AND pd_type = @ShmtType 


      UPDATE PO_DETAIL01 
       SET lpd_status = @VerifiedStatus 
      WHERE lpd_shipment_id = @i_SHIPMENT_ID 
        AND lpd_po_number = @i_POKEY 
        AND lpd_customer_id = @i_CUSTOMER_ID 
        AND lpd_status = @AvailableStatus 

     IF @debug = 1 
      BEGIN 
       SELECT @ShipmentSKUCount AS SKUCOUNT 
       , @ShipmentSKUCountCur AS SKUCOUNTCUR 
       , @SKU AS SKU 
       , @ShipmentID AS SHIPMENT 
       , @POKey AS POKEY 
      END 

      SET @ShipmentSKUCountCur = @ShipmentSKUCountCur + 1 

     END 
CLOSE Verify_Shipment_Cur 
DEALLOCATE Verify_Shipment_Cur 

回答

1

它看起來不錯,但我顯然沒有你的數據來協助。我可以推薦在光標的各個部分放置幾個打印語句。這樣你就可以看到代碼是如何流動的。它不會幫助,但那就是我會做的。

+0

我做了你的建議和數據流看起來不錯。沒有我能看到的問題。 – jorame

+0

因此,流程對調試開啓和關閉都正確工作? –

0

請你能試着定義explicilty這兩個變量:set @ShipmentSKUCount=[initial value],set @ShipmentSKUCountCur=[initial or constant value]看看會發生什麼?
此外,我發現沒有檢查@@FETCH_STATUS。它也可能導致讀取同一行兩次或更多。
請給出一個反饋。