1


0

最上位のUNION、INTERSECT、またはEXCEPT演算子を含むステートメントでは、変数の割り当ては許可されません

SQL 2008 R2を実行しています。 このプロシージャは、VS 2008 DBプロジェクトの検証に合格しましたが、管理スタジオでは失敗しました。 何か案が?

CREATE PROCEDURE [dbo].[WRHS_chkBinTransferItem]
(
 @BinFromID int,
 @BarCodeNumber varchar(50),
 @Count int,
 @Message varchar(500) OUTPUT
)

AS

DECLARE
@LotTrackIND int,
@ItemID int,
@QtyAvail int,
@LotNumber varchar(50)

SELECT @ItemID = i.ItemID, @LotTrackIND = i.LotTrackingInd, @LotNumber = ''
FROM WRHS_ItemUOM iu
INNER JOIN WRHS_Item i ON iu.ItemID = i.ItemID
WHERE iu.BarcodeNumber = @BarCodeNumber
UNION
SELECT @ItemID = i.ItemID, @LotTrackIND = i.LotTrackingInd, @LotNumber = wil.LotNumber
FROM WRHS_WarehouseItemLotIdentify wili
INNER JOIN WRHS_WarehouseItemLot wil ON wili.WarehouseItemLotID = wil.WarehouseItemLotID
INNER JOIN WRHS_WarehouseItem wi ON wil.WarehouseItemID = wi.WarehouseItemID
INNER JOIN WRHS_Item i ON wi.ItemID = i.ItemID
WHERE wili.ItemIdentification = @BarCodeNumber

IF @LotTrackIND = 1
 BEGIN
  IF @ItemID > 0
   BEGIN
    SELECT DISTINCT @QtyAvail = q.Qty
    FROM WRHS_BinItem bi
    INNER JOIN WRHS_BinItemQty q ON bi.BinItemID = q.BinItemID
    WHERE bi.BinID = @BinFromID AND bi.ItemID = @ItemID AND q.LotNumber = @LotNumber

    IF @Count <= @QtyAvail
     BEGIN
      SELECT DISTINCT q.BinItemQtyID, RTRIM(i.ItemNumber) as ItemNumber, i.LicensePlateInd, q.LotNumber, i.LotTrackingInd, i.ItemID, wi.ForcedPutAwayInd
      FROM WRHS_Bin b
      INNER JOIN WRHS_BinItem bi ON b.BinID = bi.BinID
      INNER JOIN WRHS_BinItemQty q ON bi.BinItemID = q.BinItemID
      INNER JOIN WRHS_Item i On bi.ItemID = i.ItemID
      INNER JOIN WRHS_WarehouseItem wi ON b.WarehouseID = wi.WarehouseID AND i.ItemID = wi.ItemID
      WHERE b.BinID = @BinFromID AND bi.ItemID = @ItemID AND q.LotNumber = @LotNumber

      SET @Message = 'Success'
     END
    ELSE
     BEGIN
      SET @Message = 'Selected Quantity not Available'
     END
   END
  ELSE
   BEGIN
    SET @Message = 'Invalid BarCode Scan, this Item is Lot Tracked and the proper BarCode must be scanned.'
   END
 END
ELSE
 BEGIN
  IF @ItemID > 0
   BEGIN
    SELECT DISTINCT @QtyAvail = q.Qty
    FROM WRHS_BinItem bi
    INNER JOIN WRHS_BinItemQty q ON bi.BinItemID = q.BinItemID
    WHERE bi.BinID = @BinFromID AND bi.ItemID = @ItemID AND q.LotNumber = @LotNumber

    IF @Count <= @QtyAvail
     BEGIN
      SELECT DISTINCT q.BinItemQtyID, RTRIM(i.ItemNumber) as ItemNumber, i.LicensePlateInd, q.LotNumber, i.LotTrackingInd, i.ItemID, wi.ForcedPutAwayInd
      FROM WRHS_Bin b
      INNER JOIN WRHS_BinItem bi ON b.BinID = bi.BinID
      INNER JOIN WRHS_BinItemQty q ON bi.BinItemID = q.BinItemID
      INNER JOIN WRHS_ItemUOM iu ON bi.ItemID = iu.ItemID
      INNER JOIN WRHS_Item i On bi.ItemID = i.ItemID
      INNER JOIN WRHS_WarehouseItem wi ON b.WarehouseID = wi.WarehouseID AND i.ItemID = wi.ItemID
      WHERE b.BinID = @BinFromID AND bi.ItemID = @ItemID AND q.LotNumber = @LotNumber

      SET @Message = 'Success'
     END
    ELSE
     BEGIN
      SET @Message = 'Selected Quantity not Available'
     END
   END
  ELSE
   BEGIN
    SET @Message = 'Invalid BarCode Scan'
   END
 END

3 Answer


3


割り当て部分については、サブクエリを使用して解決できます。たとえば、

Select @ItemID = ItemID, @LotTrackIND = LotTrackingInd, @LotNumber = LotNumber
  from (
        SELECT i.ItemID, i.LotTrackingInd, '' LotNumber
        FROM WRHS_ItemUOM iu
        INNER JOIN WRHS_Item i ON iu.ItemID = i.ItemID
        WHERE iu.BarcodeNumber = @BarCodeNumber
        UNION
        SELECT i.ItemID, i.LotTrackingInd, wil.LotNumber
        FROM WRHS_WarehouseItemLotIdentify wili
        INNER JOIN WRHS_WarehouseItemLot wil ON wili.WarehouseItemLotID = wil.WarehouseItemLotID
        INNER JOIN WRHS_WarehouseItem wi ON wil.WarehouseItemID = wi.WarehouseItemID
        INNER JOIN WRHS_Item i ON wi.ItemID = i.ItemID
        WHERE wili.ItemIdentification = @BarCodeNumber
       ) q1

クエリが返す可能性のある(可能性のある)複数のレコードを繰り返し処理していないと思います。

宜しくお願いします。


0


あなたの組合では、変数の割り当てを行うことはできません

SELECT @ItemID = i.ItemID, @LotTrackIND = i.LotTrackingInd, @LotNumber = ''
...
UNION
SELECT @ItemID = i.ItemID, @LotTrackIND = i.LotTrackingInd, @LotNumber = wil.LotNumber
...

エラーが言うように。

VSに合格した理由については、VSのバグです。


0


ええ、この部分にエラーがあります。

SELECT @ItemID = i.ItemID, @LotTrackIND = i.LotTrackingInd, @LotNumber = ''
FROM WRHS_ItemUOM iu
INNER JOIN WRHS_Item i ON iu.ItemID = i.ItemID
WHERE iu.BarcodeNumber = @BarCodeNumber
UNION
SELECT @ItemID = i.ItemID, @LotTrackIND = i.LotTrackingInd, @LotNumber = wil.LotNumber
FROM WRHS_WarehouseItemLotIdentify wili
INNER JOIN WRHS_WarehouseItemLot wil ON wili.WarehouseItemLotID = wil.WarehouseItemLotID
INNER JOIN WRHS_WarehouseItem wi ON wil.WarehouseItemID = wi.WarehouseItemID
INNER JOIN WRHS_Item i ON wi.ItemID = i.ItemID
WHERE wili.ItemIdentification = @BarCodeNumber

ステートメントにUNIONがある場合、selectステートメントを使用して変数に値を割り当てることはできません。 あなたがそれについて考えるならば、それは意味をなしません。 変数は1つの値しか保持できませんが、どちらを選択する必要がありますか? 最初の選択ステートメントからのものか、2番目のものですか?

その選択を明示的にする必要があります。 2番目のselectステートメントを優先する(つまり、2番目のselectから値を取得する)と仮定します。 2番目のselectステートメントで値が返されない場合は、最初のselectステートメントで返された値を取得します)、次のようなことができます

SELECT @ItemID = i.ItemID, @LotTrackIND = i.LotTrackingInd, @LotNumber = ''
FROM WRHS_ItemUOM iu
INNER JOIN WRHS_Item i ON iu.ItemID = i.ItemID
WHERE iu.BarcodeNumber = @BarCodeNumber

SELECT @ItemID = i.ItemID, @LotTrackIND = i.LotTrackingInd, @LotNumber = wil.LotNumber
FROM WRHS_WarehouseItemLotIdentify wili
INNER JOIN WRHS_WarehouseItemLot wil ON wili.WarehouseItemLotID = wil.WarehouseItemLotID
INNER JOIN WRHS_WarehouseItem wi ON wil.WarehouseItemID = wi.WarehouseItemID
INNER JOIN WRHS_Item i ON wi.ItemID = i.ItemID
WHERE wili.ItemIdentification = @BarCodeNumber