1

問題が発生している SQL カーソルがあります。IF @debug = 1カーソル内からステートメントを削除すると、最初のレコードのみFETCHが更新されますが、そのままにしておくとIF @debug = 1、必要なすべてのレコードが更新されます。なぜこれが起こっているのかについての考えは、カーソルに何か問題がある可能性が最も高いことを知っていますか? コードは以下のとおりです。

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
4

2 に答える 2

1

私には問題ないように見えましたが、明らかに支援するデータがありません。カーソルのさまざまな部分にいくつかの印刷ステートメントを配置することをお勧めします。そうすれば、コードが実際にどのように流れているかを確認できます。それは役に立ちませんが、それが私がすることです。

于 2013-08-30T15:58:14.597 に答える
0

両方の変数を明示的に定義してみてください: set @ShipmentSKUCount=[initial value]set @ShipmentSKUCountCur=[initial or constant value]何が起こるか見てみましょう?
また、 のチェックがないことがわかりました@@FETCH_STATUS。また、同じ行を 2 回以上読み取ることになる場合もあります。
フィードバックをお願いします。

于 2013-08-30T17:09:53.877 に答える