【问题标题】:Transact SQL - error when trying to perform an insertTransact SQL - 尝试执行插入时出错
【发布时间】:2016-05-15 12:28:22
【问题描述】:

所以我的问题是,在我的表上执行名为Contrat 的插入操作后出现以下错误

消息 512,级别 16,状态 1,过程 trig1,第 137 行。

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

我在表上设置了一个在插入后触发的触发器,当我禁用触发器时,插入工作完美。我环顾四周,发现'触发器没有被编程为处理多行返回',我仍然不知道如何解决这个问题。 这是触发器:

create trigger trig1
on Contrat
after insert
as begin

declare @contrat int, @total money
set @contrat = (select inserted.numcontrat from inserted)
set @total = (select inserted.prix_mensuel * 12 from inserted)

update Ville
set Ville.total_ville = (select Ville.total_ville + @total from Ville)
from Contrat C, Bien_immobilier B, Quartier Q, Ville V
where C.code_bien = B.code_bien and B.code_Quartier = Q.code_quartier and Q.code_ville = V.code_ville and C.numcontrat = @contrat

end

Contrat 中插入一行后,触发器应该更新另一个名为Ville 的表中的列,因为我需要通过四个表才能到达它。

如果需要任何其他信息,请告诉我。

提前致谢。

【问题讨论】:

  • 1) SQL Server 触发器按整个语句工作,而不是逐行工作。所以如果有多个插入,set @contrat = (select inserted.numcontrat from inserted) 将无法工作 2) from Contrat C, Bien_immobilier B, Quartier Q, Ville V 使用 JOIN 而不是旧的逗号语法 3) 为什么 set Ville.total_ville = (select Ville.total_ville + @total from Ville) ?你想要set Ville.total_ville += @total吗?
  • 对于(3),是的,当在表Contrat 中插入一行时,表Ville 中的total_ville 行将被更新,其中@total 将添加到其原值。

标签: tsql triggers


【解决方案1】:

问题解决了!

显然,问题出在这一行: set Ville.total_ville = (select Ville.total_ville + @total from Ville)

所以它所做的是用整个表更新列Ville.total_ville,因为查询(select Ville.total_ville + @total from Ville)返回一个表,因为没有应用条件过滤器。

为了解决这个问题,我就是这样做的:

create trigger trig1
on Contrat
after insert
as begin

declare @contrat int, @total money
set @contrat = (select inserted.numcontrat from inserted)
set @total = (select inserted.prix_mensuel * 12 from inserted)

update Ville
set Ville.total_ville = Ville.total_ville + @total
from Contrat C, Bien_immobilier B, Quartier Q
where C.code_bien = B.code_bien and B.code_Quartier = Q.code_quartier and Q.code_ville = Ville.code_ville and C.numcontrat = @contrat

end

非常感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多