2013-11-29 6 views
1
ALTER Procedure [dbo].[sp_Update_Quantity] 
(
    @Quantity INT, 
    @Product_ID INT 
) 
AS 
BEGIN 
begin try 
Begin Transaction 
    update Product 
    Set Product.Quantity=([email protected]) 
    where ([email protected]>0) 
    AND @Product_ID IN (Select Product_ID from Product) 

    insert into Product_Sales(Product_ID,Quantity) 
    values(@Product_ID,@Quantity) 
commit Transaction 
print 'Successfull Inserted' 
end try 
begin catch 
    Rollback Transaction 
    print 'Operation is not Successfull' 
end catch 
END 

Моя хранимая процедура работает нормально, но проблема в том, что не проверяет состояниетранзакции внутри хранимой процедуры с входным параметром

(quantity - @quantity) > 0 

.

Если мое входное количество больше количества конкретных данных продукта, оно только вставляется в таблицу Product_Sales. Но я хочу, чтобы условие (quantity - @quantity) > 0 не удавалось выполнить транзакцию, но совершает транзакцию. Зачем? Как решить проблему?

+3

Сторона примечания: вы не должны ** использовать префикс 'sp_' для ваших хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

+0

Нет ничего, чтобы поднять ошибку в вашей процедуре. Он будет оценивать предложение where, найти 0 строк, соответствующих этим условиям, обновить 0 строк и продолжить. – charlieparker

+0

Я думаю, что вы не просто обновляете строку с Product_ID = значением параметра (как вы, вероятно, предполагали), а скорее обновляете все строки с помощью параметра Quantity> @Quantity, если только переданный параметр Product_ID находится в таблице !!! Похоже, что ответ Мухаммеда Али ниже говорит об этом. – GilM

ответ

1
ALTER Procedure [dbo].[usp_Update_Quantity] --<--- See explanation by marc_s in your comments 
(            -- about using sp prefix for your procs 
@Quantity INT, 
@Product_ID INT 
) 
AS 
BEGIN 
begin try 
      DECLARE @Stock INT; 

      SELECT @Stock = Product.Quantity 
      FROM Product 
      WHERE Product_ID = @Product_ID 

      IF (@Stock < @Quantity) 
      BEGIN 
      RAISERROR('Not Enough Stock', 16, 1) 
      RETURN 
      END 

    Begin Transaction 
      update Product 
      Set Product.Quantity=([email protected]) 
      where Product_ID = @Product_ID 


      insert into Product_Sales(Product_ID,Quantity) 
      values(@Product_ID,@Quantity) 
    commit Transaction 
     print 'Successfull Inserted' 
end try 

begin catch 
    IF @@ROWCOUNT > 0 
     Rollback Transaction 

    print 'Operation is not Successfull' 
end catch 
END 
Смежные вопросы