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;
我有 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;