具有多个变量的自动大容量插入/更新



Hej,

更新感谢大家的回答和提示。我知道我的第一次尝试是错误的,所以也许更好的方法是用语言描述我的问题,而不是尝试一个糟糕的触发器。

表A是所有客户端的列表。对于search客户端存在多个订单(该表中其他不需要的信息旁边):

否是是[/tr>是[/tr>
CLIENT 订单 可选
A 1
A 2
A 3
B 16818
B 342

触发器的最佳实践:

  1. 除非你没有其他选择,否则不要创建它们
  2. 通常最好将插入和更新触发器分开,有时它们可以组合在一起
  3. NOCOUNT停止返回客户端的虚假消息,XACT_ABORT表示任何错误都会自动回滚事务
  4. 检查是否有任何相关的行,如果没有提前退出
  5. 如果相关,还可以使用UPDATE()函数检查更新语句中是否存在列(这并不意味着行实际上已经更改)
  6. UPDATE触发器中,确保比较inserteddeleted行的实际更改
  7. 最重要的是:注意inserteddeleted可能包含多行
CREATE TRIGGER Trg_TableA_OPTIONAL_ins
ON TableA
AFTER INSERT
AS
SET NOCOUNT, XACT_ABORT ON;
IF (NOT EXISTS (SELECT 1 FROM inserted WHERE OPTIONAL = 'NO'))
RETURN;
INSERT TableB (CLIENT, [ORDER])
SELECT CLIENT, [ORDER]
FROM inserted
WHERE OPTIONAL = 'NO';
GO
CREATE TRIGGER Trg_TableA_OPTIONAL_upd
ON TableA
AFTER UPDATE
AS
SET NOCOUNT, XACT_ABORT ON;
IF (NOT EXISTS (SELECT 1 FROM inserted))
RETURN;
INSERT TableB (CLIENT, [ORDER])
SELECT CLIENT, [ORDER]
FROM (
SELECT CLIENT, [ORDER], OPTIONAL
FROM inserted
WHERE OPTIONAL = 'NO'
EXCEPT
SELECT CLIENT, [ORDER], OPTIONAL
FROM deleted
) i
EXCEPT
SELECT CLIENT, [ORDER]
FROM TableB;
DELETE FROM b
FROM TableB b
JOIN (
SELECT CLIENT, [ORDER], OPTIONAL
FROM inserted
WHERE OPTIONAL = 'YES'
EXCEPT
SELECT CLIENT, [ORDER], OPTIONAL
FROM deleted
) i
ON TableB.CLIENT = Source.CLIENT AND TABLEB.[ORDER] = Source.[ORDER];
GO

最新更新