2016-04-11 5 views
-1

У меня есть один запрос, как показано ниже, у меня может быть более хороший запрос, чем этот, или он правильно закодирован? Любое предложение будет полезно для меня.Состояние проверки хранимой процедуры SQL Server и обновление/вставка

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 

И иногда это не добавляет количеству Товаров, но в то же время вычитается из магазина. Не все время это происходит.

+1

Если это работает так, как вы хотите, чтобы это сработало, то все в порядке, единственное, что нужно свести к минимуму в хранимой процедуре, это использовать join, делая вложенный SELECT лучше, чем использование объединений, вложенные операторы SELECT ускорят выполнение. –

+0

Да, я не могу сказать, что он работает правильно, чувствует, что я делаю неправильно. – NAJEEB

ответ

0

Я не уверен, что логика в отношении @Qty - но из краткого обзора - это, кажется, как и все, что он делает:

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 выглядит не могут быть использованы на всех, делая одну из ИФ бессмыслен.
В зависимости от индексов и т. Д. Я также хотел бы сделать INSERT в JOIN вместо двух выбранных.

+0

это реальная цена, я упоминаю там, если есть какая-то цена, отличная от магазина, она будет стоить только выше. я забыл удалить его из кода. теперь это неприменимо в этом случае. – NAJEEB