sql-server - 仅当列值包含 XXXX 时才触发插入
问题描述
假设我们有一个表,其中组合了许多唯一代码。例如: 账单号:
- XOUT12345
- SOUT12345等
我想创建一个触发器,确保只有值为“XOUT%”的触发器在触发器中使用并插入到另一个表中。但是,这似乎特别有效(我认为),然后当我创建使用格式 B 的文档时,保存文档时出现错误。
表格如下:
- 一张名为 ICSTOCKBILL 的表,其中所有进出的交货都使用上述格式保存到该表中。
- 一列 = FBillNo,其中注册了账单编号。
- 一列 = FStatus,如果是,则批准状态更新为 1。
1 名为 3026 的表,ICSTOCKBILL (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
所以最终目标是:所有被批准的文档(FStatus = 更新)必须通过触发器运行。但只有那些具有 XOUT 格式的才应该插入到表 3026 中。
到目前为止,在我应用这个触发器之后,它就可以工作了。我创建了一个新的销售交货,它还没有在新表中。我批准它,它就在那里。
但是,没有说格式的其他文件,得到错误:
更新 ICSTOCKBILL SET FORDERAFFIRM=0 WHERE FBILLNO=SEOUT1234 违反唯一键约束'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
如果您仍然收到最初报告的错误,那么我非常怀疑它与触发器有什么关系。它报告主表上的唯一约束已被违反,并且触发器不会触及该表。我怀疑您的测试数据可能不够独特。
推荐阅读
- reactjs - 意外令牌 (38:8)
- ios - 当我在 UITableView 中使用下拉刷新时应用程序崩溃
- python - django PermissionRequiredMixin permission_required 不起作用
- spring - MongoDB 聚合错误:引用无效
- python - glProgramUniformMatrix3fv 不能正常工作
- javascript - Javascript Object 按属性获取对象
- python - 神经网络对具有不同特征的不同实例做出相同的预测
- pip - Windows 10 上的 Anaconda 3 无法安装 pyinstaller - ssl 证书问题
- node.js - 如何从 npm 包中安装特定文件,例如仅从 bootstrap bootstrap.min.css?
- mysql - 仅从 1 行中选择和订购