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
не удавалось выполнить транзакцию, но совершает транзакцию. Зачем? Как решить проблему?
Сторона примечания: вы не должны ** использовать префикс '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_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –
Нет ничего, чтобы поднять ошибку в вашей процедуре. Он будет оценивать предложение where, найти 0 строк, соответствующих этим условиям, обновить 0 строк и продолжить. – charlieparker
Я думаю, что вы не просто обновляете строку с Product_ID = значением параметра (как вы, вероятно, предполагали), а скорее обновляете все строки с помощью параметра Quantity> @Quantity, если только переданный параметр Product_ID находится в таблице !!! Похоже, что ответ Мухаммеда Али ниже говорит об этом. – GilM