estado numFactura
a 1
a 2
c 3
c 4
create trigger deleteFactura
on factura
INSTEAD OF DELETE
as
declare @estado varchar
set @estado= (select estado from deleted);
begin
if @estado='c'
THROW 51000, 'La factura esta cerrada, no se puede eliminar', 1
else
delete from factura
where numFactura=(select numFactura from deleted)
end
go
目标:删除带有estado ='c'
的寄存器,保留带有estado='a'
的寄存器
我需要它与多个值一起工作。 如果我尝试删除两个值,则会出现此错误:
信息512,级别16,状态1,过程deleteFactura,第6行[批处理开始第9行]
子查询返回的值超过1。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。
如何使它接受多个值?
答案 0 :(得分:0)
在编写触发器时,请始终记住,它可能正在处理多个记录。 表INSERTED和DELETED中提供了要插入,删除或更新的记录。即它们似乎是表,但它们仅存在于触发器中。
create table dbo.Invoices ( Status varchar(1), InvoiceNum int )
go
create trigger DeleteInvoice on Invoices
instead of delete
as
delete from Invoices where InvoiceNum in ( select InvoiceNum from deleted ) and Status='a'
go
insert into Invoices ( Status, InvoiceNum ) values
( 'a', 1 ), ('a', 2 ), ('c', 3 ), ('c', 4 )
select * from Invoices
delete from Invoices
select * from Invoices
答案 1 :(得分:0)
您要与已删除的集合一起加入,以仅选择要删除的行,并添加适当的WHERE子句...如下所示:
CREATE TRIGGER DeleteInvoice ON Invoices
INSTEAD OF DELETE
AS
BEGIN
DELETE inv
FROM Invoices inv
INNER JOIN deleted d ON inv.InvoiceNum = d.InvoiceNum
WHERE inv.Status = 'a'
END