首页 > 解决方案 > 使用多个变量自动批量插入/更新

问题描述

嘿嘿,

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

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

客户 命令 可选的
一个 1
一个 2 是的
一个 3
16818 是的
342 是的

我需要在自动批量过程中将所有 OPTIONAL=NO 订单插入表 B。订单可能从 OPTIONAL=NO 更改为 OPTIONAL=YES,因此我不仅需要插入解决方案,还需要更新解决方案。

非常感谢!

标签: sql-servertriggers

解决方案


触发器的最佳实践:

  1. 除非您别无选择,否则不要创建它们。
  2. 通常最好将插入和更新触发器分开,有时它们可​​以结合使用。
  3. NOCOUNT停止返回给客户端的虚假消息,这XACT_ABORT意味着任何错误都会自动回滚事务。
  4. 检查是否有任何相关的行,如果没有提前纾困。
  5. 如果相关,还使用函数检查更新语句中是否存在列UPDATE()(这并不意味着该行实际上已更改)
  6. UPDATE触发器中,确保比较实际更改inserteddeleted行。
  7. 最重要的是:注意insertedanddeleted 可能包含多行
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

推荐阅读