1

我有一个名为 test 的表和另一个名为 trigg 的表......我想要的是......每当插入“name”为“rakesh”的数据进行测试......它应该触发一个触发器来插入'trigg' 表中的年龄....

我自己试过.... chk it....

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.

帮帮我....

4

3 回答 3

1
  • 当您应该从INSERTED中选择时,您正在从test中选择。您希望您的语句根据插入的内容生效,而不是根据表可能包含的内容。

  • 即使在更改之后,每个语句都会触发一次触发器,而不是每行触发一次。如果插入影响多行,则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
于 2013-07-25T19:03:06.157 回答
0

像这样的东西怎么样:

CREATE TRIGGER trigger1
ON test AFTER insert AS

INSERT INTO trigg (age)
SELECT name FROM INSERTED
WHERE name like 'rakesh'

我根据您提供的代码猜测您的表结构,但这应该更接近您的需要。

于 2013-07-25T19:05:30.533 回答
0

在没有看到您的触发器的情况下,我猜您做出了错误的假设,即在触发器中一次只处理一条记录,因此您尝试将一些标量变量设置为插入或删除的字段的值,如下所示:

set @test = (select id from inserted)

您必须假设一次将处理多个记录来编写触发器。这是集合论而不是逐行处理。

另一种可能性是您正在使用的操作查询中有一些子查询,并且确实返回了多条记录。

另一种可能性是 trigg 表上有一个写得很糟糕的查询,这就是导致您的错误的原因。

于 2013-07-25T19:04:02.120 回答