2013-08-30 2 views
1

문제점이있는 SQL 커서가 있습니다. 커서 내부에서 IF @debug = 1 문을 제거하면 FETCH의 첫 번째 레코드 만 업데이트되지만, IF @debug = 1을 그대로두면 필요한 모든 레코드가 업데이트됩니다. 왜 이런 일이 벌어지고 있는지에 대한 아이디어는 내 Cursor에 문제가있을 가능성이 가장 높습니다. 코드는 다음과 같습니다.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

나는 괜찮은 것처럼 보였습니다.하지만 분명히 도움을받을 데이터가 없습니다. 커서의 여러 부분에 몇 개의 print 문을 넣는 것을 권장 할 수 있습니다. 그렇게하면 코드가 실제로 어떻게 흐르는 지 볼 수 있습니다. 그것은 도움이되지 않지만 그게 내가 할 것입니다.

+0

나는 당신이 추천 한대로 데이터 흐름이 좋아 보인다. 내가 볼 수있는 문제는 없습니다. – jorame

+0

따라서 디버그를 켜고 끌 때 흐름이 올바르게 작동합니까? –

0

제발, 당신은 explicilty 두 변수를 정의하려고 할 수 있습니까 : set @ShipmentSKUCount=[initial value], set @ShipmentSKUCountCur=[initial or constant value] 그리고 무슨 일이 일어날까요?
또한 @@FETCH_STATUS에 대한 검사가 없습니다. 동일한 행을 두 번 이상 읽는 결과가 발생할 수도 있습니다.
의견을 보내주십시오.

관련 문제