我有两个表:
表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