2016-04-11 1 views
-1

Aşağıdaki gibi bir sorgum var, bundan daha iyi bir sorgu alabilir miyim, yoksa doğru şekilde kodlanmış mı? Herhangi bir öneri benim için yararlı olacaktır.SQL Server saklı yordam kontrol koşulu ve güncelleştir/ekle

ALTER Procedure [dbo].[TransferStockFromWarehouse] 
    @ItemCode varchar(200) = NULL, 
    @ToWarehouse varchar(150) = NULL, 
    @FromWarehouse varchar(150) = NULL, 
    @Qty decimal = NULL 
AS 
    DECLARE @RealPrice decimal(18,2) = NULL 
    SET @RealPrice = (SELECT Price 
         FROM StockInWarehouse 
         WHERE ItemCode = @ItemCode 
         AND WarehouseName = @ToWarehouse) 

    IF EXISTS (SELECT ItemCode 
       FROM StockInWarehouse 
       WHERE ItemCode = @ItemCode 
       AND WarehouseName = @ToWarehouse) 
    BEGIN 
     UPDATE StockInWarehouse 
     SET Qty = Qty + @Qty 
     WHERE ItemCode = @ItemCode 
      AND WarehouseName = @ToWarehouse 
    END 
    ELSE IF (@RealPrice > 0) OR (@RealPrice IS NOT NULL) 
    BEGIN 
     INSERT INTO StockInWarehouse(ItemCode, ItemName, WarehouseName, Price, Qty) 
     VALUES (@ItemCode, 
       (SELECT ItemName 
       FROM ItemMaster 
       WHERE ItemCode = @ItemCode), @ToWarehouse, 
       (SELECT Price 
       FROM StockInWarehouse 
       WHERE ItemCode = @ItemCode AND WarehouseName = @FromWarehouse), @Qty) 
    END 
    ELSE 
    BEGIN 
     INSERT INTO StockInWarehouse(ItemCode, ItemName, WarehouseName, Price, Qty) 
     VALUES (@ItemCode, 
       (SELECT ItemName 
       FROM ItemMaster 
       WHERE ItemCode = @ItemCode), 
       @ToWarehouse, 
       (SELECT Price 
       FROM StockInWarehouse 
       WHERE ItemCode = @ItemCode AND WarehouseName = @FromWarehouse), 
       @Qty) 
    END 
BEGIN 
    UPDATE StockInWarehouse 
    SET Qty = Qty - @Qty 
    WHERE ItemCode = @ItemCode AND WarehouseName = @FromWarehouse 
END 

Ve bazen Towarehouse miktar ama fromwarehouse düşülür aynı anda ekleyerek değildir. Her zaman değil.

+1

Çalışmak istediğiniz şekilde çalışıyorsa, o zaman sorun yok, saklı yordamları en aza indirgeyecek tek şey birleştirme kullanmaktır, iç içe geçmiş bir SELECT yapmak birleşimleri kullanmaktan daha iyidir, iç içe SELECT ifadeleri yürütmeyi daha hızlı gerçekleştirir. –

+0

Evet, düzgün çalıştığını söyleyemem, yanlış yaptığım bir yerde hissediyor. – NAJEEB

cevap

0

Ben mantık @Qty ilgili olduğunu emin değilim - ama hızlı bir genel bakış elde - Bu Ne yapıyor hepsi gibi görünüyor: birini yaparak

ALTER Procedure [dbo].[TransferStockFromWarehouse] 
     @ItemCode varchar(200) = NULL, 
     @ToWarehouse varchar(150) = NULL, 
     @FromWarehouse varchar(150) = NULL, 
     @Qty decimal = NULL 
    AS 
     IF EXISTS (SELECT ItemCode 
        FROM StockInWarehouse 
        WHERE ItemCode = @ItemCode 
        AND WarehouseName = @ToWarehouse) 
     BEGIN 
      UPDATE StockInWarehouse 
      SET Qty = Qty + @Qty 
      WHERE ItemCode = @ItemCode 
       AND WarehouseName = @ToWarehouse 
     END 
      INSERT INTO StockInWarehouse(ItemCode, ItemName, WarehouseName, Price, Qty) 
      VALUES (@ItemCode, 
        (SELECT ItemName 
        FROM ItemMaster 
        WHERE ItemCode = @ItemCode), @ToWarehouse, 
        (SELECT Price 
        FROM StockInWarehouse 
        WHERE ItemCode = @ItemCode AND WarehouseName = @FromWarehouse), @Qty) 
     END 
BEGIN 
    UPDATE StockInWarehouse 
    SET Qty = Qty - @Qty 
    WHERE ItemCode = @ItemCode AND WarehouseName = @FromWarehouse 
END 

RealPrice hiç kullanılmaması görünüyor IF'nin anlamsız.
Dizinlere vb. Bağlı olarak, INSERT'i iki seçim yerine bir JOIN haline getirmeyi düşünürdüm.

+0

orada gerçek fiyat ben bahsetmiyorum, mağaza arasında farklı bir fiyat varsa, sadece daha yüksek bir fiyat alacaktır. Bunu koddan kaldırmayı unuttum. şimdi bu durumda geçerli değildir. – NAJEEB