如何传递多个参数以删除触发器上的操作?

时间:2018-08-17 16:12:48

标签: sql sql-server

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。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。

如何使它接受多个值?

2 个答案:

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