如何在sql server触发器中更改插入的行

时间:2012-10-17 11:33:02

标签: sql-server-2008 triggers

这给出了错误

  

Msg 156,Level 15,State 1,Procedure Trig_Insert_Serials_Null,Line 30
  关键字' INSERT'。

附近的语法不正确

表格结构:

Serials (CurrencyId, DivisionId, BranchId, NewSerialNumber, Display, TypeId)

我想在(CurrencyId, DivisionId, BranchId)中将0更改为null。

CREATE TRIGGER Trig_Insert_Serials_Null
   ON  Serials
   INSTEAD OF INSERT   
AS 
BEGIN

DECLARE @currencyId int;
DECLARE @branchId int;
DECLARE @divisionId int;

SELECT @currencyId = INSERTED.CurrenceyId FROM INSERTED;
SELECT @branchId = INSERTED.BranchId FROM INSERTED;
SELECT @divisionId = INSERTED.DivisionId FROM INSERTED;

IF @currencyId = 0 
    SET @currencyId = NULL;
END

IF @branchId = 0 
    SET @branchId = NULL;
END

IF @divisionId = 0 
    SET @divisionId = NULL;
END


INSERT INTO Serials (CurrenceyId,DivisionId,BranchId,NewSerialNumber,
                         Display, TypeId)
VALUES (INSERTED.CurrenceyId,INSERTED.DivisionId, INSERTED.BranchId,
         INSERTED.NewSerialNumber, INSERTED.Display,INSERTED.TypeId)

END
GO

2 个答案:

答案 0 :(得分:1)

删除3个IF语句中的3个END。

END应以BEGIN开头

您的触发器中有4个结束且只有一个BEGIN

答案 1 :(得分:1)

您假设触发器每行触发一次 - 这是错误

触发器每个触发一次,并且可以针对插入50行的单个INSERT语句触发。

因此,您的陈述如下:

SELECT @currencyId = INSERTED.CurrenceyId FROM INSERTED;

会悲惨地失败。

您需要重新编写触发器才能将此考虑在内 - Inserted表可以包含一个或多个行 - 您不能简单地假设它始终是一行。< / p>

基本上,你需要做这样的事情:

 INSERT INTO Serials (CurrenceyId, DivisionId, BranchId, NewSerialNumber, Display, TypeId)
    SELECT
       CASE i.CurrenceyId WHEN 0 THEN NULL ELSE i.CurrenceyId END,
       CASE i.DivisionId WHEN 0 THEN NULL ELSE i.DivisionId END,
       CASE i.BranchId WHEN 0 THEN NULL ELSE i.BranchId END,
       i.NewSerialNumber, i.Display, i.TypeId
    FROM Inserted i