SQL 从另一个循环触发 table

SQL Trigger with loop from another table

我有 2 tables :

Table一个

create table A
(id int identity(1,1)
,KeyWord1 nvarchar(50)
,KeyWord2 nvarchar(50)
,KeyWord3 nvarchar(50)
)

Table B

Create table B
(id int identity(1,1)
,Address nvarchar(150)
,Chk int
)

table A 包含以下值:

insert into A
values
(166, 'elyse', 'vry')
,(243, 'virginia', 'beach')
,(134, 'aris', 'adium')

Table B 包含以下值:

insert into B
values
('35 stadium street, 134 Paris', null)
,('243, Stadiumù road from Paris', null)

我的目标是在 table B 上创建新行时,将列 B.chk 设置为 table A 的出现次数。

例如:

insert into B
values
('166, road to Champs elysee - 14215 Cdx Evry', null)

table B 上的触发器应将 B.Chk 设置为 1,因为以下查询与 table A

匹配
select count(*) from inserted
where b.Address like '%166%'
and b.Address like '%elyse%'
and b.Address like '%vry%'

为此,我应该在 Table B 上创建一个触发器,但不知道如何在另一个 table 上“循环”。 我应该使用 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 虚拟 table 视为 set,就像在任何其他 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;