具有来自另一个表的循环的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,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上创建新行时,用表A中出现的次数设置列B.chk。

例如:

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还是游标?

需要构造触发器,以将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;

你是对的,我不需要循环,但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

最新更新