我有一个名为test的表和另一个名为trigg的表.....我想要的是....每当有'name'作为'rakesh'的数据被插入测试时...它应该触发一个触发器将年龄插入'trigg'表格....
我试着靠自己......明白......
create trigger trigger1
on test
after insert
as
if((select name from test) like 'rakesh')
begin
insert into trigg(age)
select name from test
end
但它没有用.. 每当我插入测试时..抱怨此错误:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
帮帮我....
答案 0 :(得分:1)
当您从 INSERTED 中进行选择时,您正在从测试中进行选择。您希望您的语句根据插入的内容生效,而不是基于表格可能包含的内容。
即使在更改之后,每个语句触发一次触发器,而不是每行触发一次。如果插入影响多行,则 INSERTED 伪表将包含多行,因此子选择将失败。
建议修订:
create trigger trigger1
on test
after insert
as
if EXISTS (select * from INSERTED where name like 'rakesh')
begin
insert into trigg(age)
select name from INSERTED
where name like 'rakesh'
end
答案 1 :(得分:0)
在没有看到你的触发器的情况下,我猜你做了一个错误的假设,即在触发器中一次只处理一条记录,因此你试图将一些scalear变量设置为插入或删除的字段的值,如下所示:
set @test = (select id from inserted)
你必须编写触发器,并假设一次会有一些muilitple记录。这是set-theory而不是逐行处理。
另一种可能性是你正在使用的动作查询中有一些子查询,它确实会返回多个记录。
另一种可能性是,trigg表上的查询写得不好,这就是造成错误的原因。
答案 2 :(得分:0)
这样的事情:
CREATE TRIGGER trigger1
ON test AFTER insert AS
INSERT INTO trigg (age)
SELECT name FROM INSERTED
WHERE name like 'rakesh'
我根据您提供的代码猜测您的表格结构,但这应该更接近您的需求。