Sql 触发器正在更新具有相同值的多行

Sql 触发器正在更新具有相同值的多行,sql,sql-server,tsql,triggers,Sql,Sql Server,Tsql,Triggers,触发器正在使用相同的值更新多行 这里有一个问题,我试图更新表(B)中的一行或多行,但它使用相同的值更新行 表A +------+-----+-----+ |ROWID |NAME |CODE | +------+-----+-----+ | 123 |pepe | 1 | | 456 |tito | 2 | | 789 |gege | 3 | ------------------- 当前结果: +------+-----+-----+---------+ |ROWID |NA

触发器正在使用相同的值更新多行

这里有一个问题,我试图更新表(B)中的一行或多行,但它使用相同的值更新行

表A

+------+-----+-----+
|ROWID |NAME |CODE |
+------+-----+-----+
| 123  |pepe |  1  |
| 456  |tito |  2  |
| 789  |gege |  3  |
-------------------
当前结果:

+------+-----+-----+---------+
|ROWID |NAME |CODE | A_ROWID |
+------+-----+-----+---------+
| 321  |rolo |  1  |  123    |
| 654  |kit  |  2  |  123    |
| 987  |gu   |  3  |  123    |
-----------------------------
预期结果:

+------+-----+-----+---------+
|ROWID |NAME |CODE | A_ROWID |
+------+-----+-----+---------+
| 321  |rolo |  1  |  123    |
| 654  |kit  |  2  |  456    |
| 987  |gu   |  3  |  789    |
-----------------------------
这是导火索,我非常感谢你的建议

ALTER TRIGGER[dbo].[TRIG\u AfterInsert]
关于[dbo][B]
插入后
作为
开始
声明@Code nvarchar(100);
从插入的代码中选择@Code=Code;
更新B
设置B.A_ROWID=A.ROWID
从
其中A.CODE=@CODE;
结束

每个语句调用一次触发器,这意味着如果更新一行,将调用一次触发器;如果更新一百万行,将再次调用触发器

所以,现在当您知道触发器的核心行为时,您应该重构以下几行:

declare@code-nvarchar(100);
从插入的代码中选择@Code=Code;
因此,完整的触发代码将是:

在插入为后在dbo.B上插入后创建或更改触发器dbo.TRIG\u
开始
更新B
设置B.A_ROWID=A.ROWID
从B
在I.ROWID=B.ROWID上连接插入的I
在A.CODE=I.CODE上连接A;
结束
只要看一看,联接中直接插入了
,使用此语句,您将过滤所有需要的行

语句中的Where子句在
JOIN
中转换