我想在sql server中制作条件触发器......

时间:2013-07-25 18:55:17

标签: c# sql sql-server database triggers

我有一个名为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.

帮帮我....

3 个答案:

答案 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'

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