You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在库存数量不足时抛出Raiserror?MERGE语句调整需求

库存扣减逻辑的正确实现方案

需求回顾

针对用户定义表@InvoiceLines中的记录,需实现:

  • 当Stock表对应ProductID的Qty大于等于源表Qty时,执行库存扣减
  • 若存在任意一条记录库存不足,抛出错误:raiserror('Qty not enough', 16, 1)

现有代码的问题

你当前的MERGE语句在ON条件中加入了TARGET.Qty >= SOURCE.Qty,这会导致库存不足的产品完全不会匹配到目标表,既不会执行扣减,也不会触发错误提示,完全无法满足需求。

正确实现方案

方案一:先批量校验库存,再执行扣减

该方案先校验所有待处理产品的库存状态,确保全部满足条件后再执行扣减,保证操作的原子性:

-- 检查是否存在库存不足的产品
IF EXISTS (
    SELECT 1
    FROM @InvoiceLines il
    INNER JOIN Stock s 
        ON s.ProductID = il.ProductID
    WHERE s.Qty < il.Qty
)
BEGIN
    RAISERROR('Qty not enough', 16, 1);
    RETURN;
END

-- 校验通过后执行库存扣减
MERGE Stock AS TARGET 
USING @InvoiceLines AS SOURCE 
    ON TARGET.ProductID = SOURCE.ProductID
WHEN MATCHED THEN
    UPDATE 
        SET Qty = TARGET.Qty - SOURCE.Qty;

方案二:在MERGE中逐行处理(不推荐)

如果需要逐行校验并在发现库存不足时立即抛错,但该方案会导致部分数据已被修改,存在数据不一致风险:

MERGE Stock AS TARGET 
USING @InvoiceLines AS SOURCE 
    ON TARGET.ProductID = SOURCE.ProductID
WHEN MATCHED THEN
    UPDATE 
        SET Qty = CASE 
                    WHEN TARGET.Qty >= SOURCE.Qty THEN TARGET.Qty - SOURCE.Qty
                    ELSE RAISERROR('Qty not enough', 16, 1)
                  END;

注意:该方案若抛出错误,之前已执行的扣减操作不会回滚,因此优先推荐方案一。

内容的提问来源于stack exchange,提问作者waleed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 21:34:57