【发布时间】:2017-07-19 13:30:50
【问题描述】:
您好,我正在研究触发器。此触发器能够比较从基 F 插入我的表 DOUBLON 的数据与从基 T 的 CLIENT 中的数据。 如果有类似的 TEL、TELPOR、TELPRO、TELDOM,那么它会更新 F.DOUBLON.doublon = 'OUI' 否则它会输入一个 'NON'。 我在 DOUBLON 表的基础 F 上创建了触发器。
我做了什么:
CREATE TRIGGER DoublonInserted
ON dbo.DOUBLON
AFTER INSERT
AS
DECLARE @doublon INTEGER
SELECT @doublon = 0
IF SELECT count(C.TEL)
FROM T.dbo.CLIENT AS C , inserted AS I
where I.TEL = C.TEL
OR I.TEL = C.TELDOM
OR I.TEL = C.TELPRO
OR I.TEL = C.TELPOR
OR I.TELDOM = C.TEL
OR I.TELDOM = C.TELDOM
OR I.TELDOM = C.TELPRO
OR I.TELDOM = C.TELPOR
OR I.TELPRO = C.TEL
OR I.TELPRO = C.TELDOM
OR I.TELPRO = C.TELPRO
OR I.TELPRO = C.TELPOR
OR I.TELPOR = C.TEL
OR I.TELPOR = C.TELDOM
OR I.TELPOR = C.TELPRO
OR I.TELPOR = C.TELPOR) > 1
BEGIN
UPDATE dbo.DOUBLON
SET DOUBLON = 'OUI' --, @doublon = 0
FROM T.dbo.CLIENT AS C, inserted AS I
where I.TEL = C.TEL
OR I.TEL = C.TELDOM
OR I.TEL = C.TELPRO
OR I.TEL = C.TELPOR
OR I.TELDOM = C.TEL
OR I.TELDOM = C.TELDOM
OR I.TELDOM = C.TELPRO
OR I.TELDOM = C.TELPOR
OR I.TELPRO = C.TEL
OR I.TELPRO = C.TELDOM
OR I.TELPRO = C.TELPRO
OR I.TELPRO = C.TELPOR
OR I.TELPOR = C.TEL
OR I.TELPOR = C.TELDOM
OR I.TELPOR = C.TELPRO
OR I.TELPOR = C.TELPOR
END
ELSE
BEGIN
UPDATE dbo.DOUBLON
SET DOUBLON = 'NON' --, @doublon = 0
FROM T.dbo.CLIENT AS C, inserted AS I
where I.TEL != C.TEL
OR I.TEL != C.TELDOM
OR I.TEL != C.TELPRO
OR I.TEL != C.TELPOR
OR I.TELDOM != C.TEL
OR I.TELDOM != C.TELDOM
OR I.TELDOM != C.TELPRO
OR I.TELDOM != C.TELPOR
OR I.TELPRO != C.TEL
OR I.TELPRO != C.TELDOM
OR I.TELPRO != C.TELPRO
OR I.TELPRO != C.TELPOR
OR I.TELPOR != C.TEL
OR I.TELPOR != C.TELDOM
OR I.TELPOR != C.TELPRO
OR I.TELPOR != C.TELPOR
END
事实上它是“工作”而不是现实:
案例工作。 如果我的插入中有任何重复,请在我的列 doublon 中为插入的每一行触发设置“NON”。 如果我的插入中只有重复项,请在我的列 doublon 中为插入的每一行触发设置“OUI”。
案例不工作。 如果有重复且没有插入重复,则无法正常工作。
我尝试重置我的 var @doublon 但还是一样。
我注意到,我的触发器将我的测试的最后结果放在了 doublon 列的所有行上。如果最新插入的是重复数据,则所有行都将显示“是”(反之亦然)。
我想请人帮忙解释一下原因,或者用其他方法(使用触发器)。
我无法触摸数据库 T(禁止添加列等)!
++ 基地在同一台服务器上 ++
感谢您的宝贵时间和您的帮助!
编辑:
表客户端
表DOUBLON
ID_CLIENT -> 整数
我想要什么: 在 Doublon 上设置正确的值
其他一切 varchar(50)
【问题讨论】:
-
Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI
JOIN语法-92 SQL 标准(25 年前),不鼓励使用它 -
你能找一位以英语为母语的人来帮你重写你的问题吗?我试图阅读它,但我就是不能。
-
这里有一些严重的逻辑问题。首先,您的更新语句将更新 DOUBLON 中的每一行。其次,如果第一个条件为真,它将只运行第一个更新语句,否则它将运行第二个。您的插入中可能有同时满足这两个条件的数据。
-
我会试试你的语法@marc_s 谢谢你的提示!
-
我们不想逐行写任何东西。相反,它应该设置为基于更新。我不能在这里提供太多,因为我不知道你的桌子是什么样子的。这是一个很好的起点。 spaghettidba.com/2015/04/24/…
标签: sql-server database triggers insert