2017-04-03 107 views
1

当在这个特定视图中插入数据时,我有一个从其他视图获取数据的视图,如下面的示例所示,需要在表vendas ref(nvarchar(50))和Estado(bool) 。视图上的Sql触发器没有被触发

ALTER TRIGGER [dbo].[TGR_VENDAS] 
ON [dbo].[VendasFinal] 
INSTEAD OF INSERT 
AS 
BEGIN 
    DECLARE 
    @Ref nvarchar(50), 
@EstadoString nvarchar(50) 

SELECT @Ref = i.ref, @EstadoString = i.ESTADO 
FROM inserted i 

if(@EstadoString = 'Em Aberto') 
    BEGIN 
     INSERT INTO dbo.Vendas 
      (ref, Estado) 
     VALUES 
      (@Ref ,0); 
    END 
ELSE 
    BEGIN 
     INSERT INTO dbo.Vendas 
      (ref, Estado) 
     VALUES 
      (@Ref ,1); 
    END 
END 

它运行在MS Sql Server 11.0上。 在此先感谢。

+3

触发器每个*语句*触发一次,而不是每个*行*触发一次。 'inserted'可以包含0,1或*多个*行。这是触发器的第一个明显问题。但是,您尚未说明您是否遇到错误,或者您还没有确定触发器“未触发”,因此难以提供进一步的帮助。 –

+0

每声明是什么意思?我只是编辑问题。 –

+2

这意味着'插入的'表格包含** all **插入的行。这在当时不是一排。 –

回答

1

这里不需要光标。你只需要使用一个case表达式。您发布的触发器可以简化为此。它可以处理任何数量的行和现有代码中的逻辑。

ALTER TRIGGER [dbo].[TGR_VENDAS] 
ON [dbo].[VendasFinal] 
INSTEAD OF INSERT 
AS 
BEGIN 

    INSERT INTO dbo.Vendas 
    (
     ref 
     , Estado 
    ) 
    SELECT i.ref 
     , case when i.ESTADO = 'Em Aberto' then 0 else 1 end 
    from inserted i