我有以下两个表:
CREATE TABLE dbo.ExampleForTrig
(
var1 int NOT NULL,
var2 varchar(255) NOT NULL,
var3 varchar(255) NOT NULL,
var4 decimal(12,2) NOT NULL,
);
CREATE TABLE dbo.amended
(
var1 int NOT NULL,
var2 varchar(255) NOT NULL,
var3 varchar(255) NOT NULL,
var4 decimal(12,2) NOT NULL,
vara int NOT NULL,
varb varchar(255) NOT NULL,
varc varchar(255) NOT NULL,
vard decimal(12,2) NOT NULL,
);
前者有一些随机信息。
INSERT INTO dbo.ExampleForTrig (var1, var2, var3, var4)
VALUES ('9', 'Geoff', 'D', '11.23');
INSERT INTO dbo.ExampleForTrig (var1, var2, var3, var4)
VALUES ('9', 'Bill', 'E', '11.23');
INSERT INTO dbo.ExampleForTrig (var1, var2, var3, var4)
VALUES ('9', 'John', 'H', '11.23');
第一个表有一个AFTER UPDATE
触发器,它将修改后的信息与新信息一起输入dbo.amended
表。
但是,在触发器中,存在重复条目的问题。
有时,对于一次更新,触发器将使用两个相同的条目填充dbo.amended
。我需要协助识别错误。
CREATE TRIGGER dbo.my_trig
ON dbo.ExampleForTrig
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO dbo.amended (var1, var2, var3, var4, vara, varb, varc, vard)
SELECT
del.var1, del.var2, del.var3, del.var4,
ins.var1, ins.var2, ins.var3, ins.var4
FROM
(SELECT
var1, var2, var3, var4
FROM
deleted ) AS del,
(SELECT
var1, var2, var3, var4
FROM
inserted) AS ins;
END;
答案 0 :(得分:3)
您只需从Inserted
和Deleted
表中进行选择 - 两者之间的无加入条件!
无论如何,这种不良做法自从 1992 以来已经被SQL标准弃用 - 超过20年前。停止使用此功能 - 使用正确的ANSI / ISO JOIN 语法(INNER JOIN
,LEFT OUTER JOIN
)代替连接条件。
您需要定义他们加入的内容 - 通常是表格中的主键(我不知道您的情况下实际上是什么PK)。
INSERT INTO dbo.amended (var1, var2, var3, var4, vara, varb, varc, vard)
SELECT
del.var1, del.var2, del.var3, del.var4,
ins.var1, ins.var2, ins.var3, ins.var4
FROM
inserted AS ins
INNER JOIN
deleted AS del ON ins.PrimaryKey = del.PrimaryKey;
否则,您要从Inserted
表格中创建每行的笛卡尔积“,并与Deleted
表格中的每一行相结合。如果您更新了3行,则会插入 9行!