sql-server - 使用多个变量自动批量插入/更新
问题描述
嘿嘿,
更新 谢谢你们的回答和提示。我知道我的第一次尝试是错误的 - 所以也许更好的方法是用文字描述我的问题,而不是尝试一个糟糕的触发器。
表 A 是所有客户端的列表。对于每个客户都存在多个订单(在该表中其他不需要的信息旁边):
客户 | 命令 | 可选的 |
---|---|---|
一个 | 1 | 不 |
一个 | 2 | 是的 |
一个 | 3 | 不 |
乙 | 16818 | 是的 |
乙 | 342 | 是的 |
我需要在自动批量过程中将所有 OPTIONAL=NO 订单插入表 B。订单可能从 OPTIONAL=NO 更改为 OPTIONAL=YES,因此我不仅需要插入解决方案,还需要更新解决方案。
非常感谢!
解决方案
触发器的最佳实践:
- 除非您别无选择,否则不要创建它们。
- 通常最好将插入和更新触发器分开,有时它们可以结合使用。
NOCOUNT
停止返回给客户端的虚假消息,这XACT_ABORT
意味着任何错误都会自动回滚事务。- 检查是否有任何相关的行,如果没有提前纾困。
- 如果相关,还使用函数检查更新语句中是否存在列
UPDATE()
(这并不意味着该行实际上已更改) - 在
UPDATE
触发器中,确保比较实际更改inserted
的deleted
行。 - 最重要的是:注意
inserted
anddeleted
可能包含多行。
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
推荐阅读
- javascript - 使用 jquery 时出错:[ts] $('.carousel').each(function(){} 需要标识符
- git - gitahead - HTTPS Credentials keeps popping up
- node.js - git hook post receive not found env: node: No such file or directory
- javascript - javascript mousedown 事件后不需要的行为
- c++ - 如何在此页面中提交来自 c++
- ubuntu - 如何将 .dash 段合并为一个文件并将其转换为 .mp4?
- css - Nativescript 中的 Font Awesome Pro
- .net - 使用 .NET 驱动程序将新文档添加到 MongDB 上的某个集合时如何获得通知?
- excel - 分组在同类群组中的数据集中唯一出现的计数
- vue.js - Vuejs2 - 如何从服务器更新整个对象而不失去反应性?