Tsql 在删除触发器中更新多行已删除的表

Tsql 在删除触发器中更新多行已删除的表,tsql,triggers,Tsql,Triggers,我从SQLServer2000中的以下触发器开始 ALTER TRIGGER DeleteTrigger ON [dbo].[WarrantyClaimsLineItems] FOR DELETE AS begin declare @wa int SET @wa = (SELECT warrantyAuthNo from DELETED) update dbo.warrantyclaimsauth set isused = 0 WHERE w

我从SQLServer2000中的以下触发器开始

 ALTER TRIGGER DeleteTrigger
 ON [dbo].[WarrantyClaimsLineItems]
 FOR DELETE
 AS 
 begin

    declare @wa int
    SET @wa = (SELECT warrantyAuthNo from DELETED)
    update dbo.warrantyclaimsauth
    set isused = 0
    WHERE warrantyClaimsAuth.warrantyauthno = @wa


end
基本上,每当从表中删除一个行项目时,我都需要将分配给该行项目的warrantyauth.isUsed更新回false

它在删除一个行项目时起作用,但在删除多个行项目时,我会出现以下错误

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
但是,这将在isUsed字段中用0更新保修期内的每一行。 谁能帮我解决我做错了什么?
谢谢大家!

您的加入条件在第二个条件中是错误的。试试这个:

 AFTER DELETE
 AS 
 begin

    update a set isUsed = 0
    from dbo.warrantyclaimsauth a
    inner join deleted d on a.warrantyAuthNo = d.warrantyAuthNo


 end
您加入了
deleted
,其中
warrantyauthno
等于自身,而不是
deleted
表中的值。实际上,您只是执行了一个
交叉连接
deleted
,而没有过滤任何行

inner join deleted d on a.warrantyAuthNo = a.warrantyAuthNo
应该是

inner join deleted d on a.warrantyAuthNo = d.warrantyAuthNo

你现在有一个简单的连接条件,给出了一个交叉连接,它不会过滤到
删除的

哦,天哪,我真是个笨蛋,我疯了,一直忽略了这一点。谢谢,很抱歉这个愚蠢的问题!
....
 AFTER DELETE
 AS 
 begin

    update dbo.warrantyclaimsauth set isUsed = 0
    from dbo.warrantyclaimsauth a
    inner join deleted d on a.warrantyAuthNo = d.warrantyAuthNo


 end
....
 AFTER DELETE
 AS 
 begin

    update dbo.warrantyclaimsauth set isUsed = 0
    from dbo.warrantyclaimsauth a
    inner join deleted d on a.warrantyAuthNo = d.warrantyAuthNo


 end