仅当列值包含 XXXX 时触发插入

Trigger Insert ONLY if column value contains XXXX

假设我们有一个 table,其中组合了许多唯一代码。例如:账单编号:

我想创建一个触发器,确保只有值 'XOUT%' 的触发器在触发器中使用并插入另一个 table。这似乎特别有效(我认为)但是,当我创建一个使用格式 B 的文档时,我在保存文档时遇到错误。

table如下:

  1. 1 table 称为 ICSTOCKBILL,其中所有进出的货物都是 使用上述格式保存到 table 中。
  2. 一栏 = FBillNo 账单号登记的地方。
  3. 一列 = FStatus,如果是,则批准状态更新为 1。

1 Table 呼叫 3026,ICSTOCKILL (FBillNo) 中的库存单号应自动转移到该位置。

我的代码如下:

create Trigger DVLP_T_InsertBillNoItemSALESDEL2 On ICStockBill
for UpDate
as
If UpDate(FStatus)  
Begin
    If not exists (Select 1 
                  From inserted a 
                  Inner Join t_Item b on b.FItemClassID=3026 AND b.FNumber=a.FBillNo where FBillNo like 'XOUT%')
    Begin
        INSERT INTO t_Item (FItemClassID,FParentID,FLevel,FName,FNumber,FShortNumber,FFullNumber,FFullName,FDetail,FDeleted) 
        Select 3026,0,1,FBillNo,FBillNo,FBillNo,FBillNo,FBillNo,1,0
        From inserted where FBillNo like 'XOUT%'

    End
End

So the end goal is: All documents that are approved (FStatus = updated) must run through the trigger. But ONLY those with XOUT format should be inserted into Table 3026.

到目前为止,在我应用此触发器后,它起作用了。我创建了一个新的销售交付,它还没有在新的 table 中。我批准它,它就在那里。

但是,其他没有上述格式的文件,报错:

UPDATE ICSTOCKBILL SET FORDERAFFIRM=0 WHERE FBILLNO=SEOUT1234 violiation of UNIQUE KEY contraint 'item2;.

如有任何提示,我们将不胜感激。

您可以通过使用适当的基于集合的逻辑而不是过程逻辑来简化整个触发器。

以下内容应该可以满足您的要求。

create trigger DVLP_T_InsertBillNoItemSALESDEL2 on ICStockBill
for update
as
begin
    set nocount on;

    -- Always use meaningful aliases - using a, b, c is asking for trouble
    insert into t_Item (FItemClassID, FParentID, FLevel, FName, FNumber, FShortNumber, FFullNumber, FFullName, FDetail, FDeleted) 
    select 3026, 0, 1, FBillNo, FBillNo, FBillNo, FBillNo, FBillNo, 1, 0
    from Inserted I
    where FBillNo like 'XOUT%'
    and FStatus = 1
    and not exists (
        select 1
        from t_Item IT
        where IT.FItemClassID = 3026
        and IT.FNumber = I.FBillNo
    );
end

如果您仍然收到最初报告的错误,那么我非常怀疑它与触发器有任何关系。它报告主 table 上的唯一约束已被违反,并且触发器未触及 table。我怀疑您的测试数据可能不够独特。