如何解决带有来自另一个表的循环的 SQL 触发器
我有两张桌子:
表A
create table A
(id int identity(1,1),KeyWord1 nvarchar(50),KeyWord2 nvarchar(50),KeyWord3 nvarchar(50)
)
表 B
Create table B
(id int identity(1,Address nvarchar(150),Chk int
)
表 A 包含以下值:
insert into A
values
(166,'elyse','vry'),(243,'virginia','beach'),(134,'aris','adium')
表 B 包含以下值:
insert into B
values
('35 stadium street,134 Paris',null),('243,Stadiumù road from Paris',null)
我的目标是在表 B 上创建新行时,将列 B.chk 设置为表 A 中出现的次数。
例如:
insert into B
values
('166,road to Champs elysee - 14215 Cdx Evry',null)
表 B 上的触发器应该将 B.Chk 设置为 1,因为以下查询与表 A 匹配
select count(*) from inserted
where b.Address like '%166%'
and b.Address like '%elyse%'
and b.Address like '%vry%'
为此,我应该在表 B 上创建一个触发器,但不知道如何在另一个表上“循环”。 我应该使用 for、while 还是光标?
解决方法
你说得对,我不需要循环,但插入后需要立即设置 chk 列。
这是我的触发器:
Create trigger TR_Update_B
ON dbo.B
AFTER insert
AS
BEGIN
SET NOCOUNT ON;
DECLARE @docNo int
DECLARE @Result int
SELECT @DocNo=id FROM inserted;
SET @Result= (select count(*) from b
join a
on b.Address like '%'+a.KeyWord1+'%'
and b.Address like '%'+a.KeyWord2+'%'
and b.Address like '%'+a.KeyWord3+'%'
where b.id=@DocNo)
Update b set Chk = @Result where id=@DocNo
END
,
您的触发器需要构建为将 inserted
虚拟表视为一个集合,就像在任何其他 SQL 语句中一样。
您不需要也不应该使用局部变量来保存触发器中的值,因为触发器对受影响的行集进行操作。
请尝试以下操作:
create or alter trigger TR_Update_B
on dbo.B
after insert
as
set nocount on;
with t as (
select i.id,Count(*) qty
from inserted i
join a on
i.Address like '%' + a.KeyWord1 + '%'
and i.Address like '%' + a.KeyWord2 + '%'
and i.Address like '%' + a.KeyWord3 + '%'
group by i.id
)
update b set
b.chk=t.qty
from t
join b on b.id=t.id;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。