0

这给出了一个错误

消息 156,级别 15,状态 1,过程 Trig_Insert_Serials_Null,第 30 行
关键字“插入”附近的语法不正确。

表结构:

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
4

2 回答 2

1

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

END 应该以 BEGIN 开头

您的触发器中有 4 个 END 并且只有一个 BEGIN

于 2012-10-17T11:43:09.107 回答
1

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

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

因此,您的陈述如下:

SELECT @currencyId = INSERTED.CurrenceyId FROM INSERTED;

会惨败。

您需要重新编写触发器以考虑到这一点 -Inserted表可以包含一行或多行 - 您不能简单地假设它始终是单行。

基本上,您需要执行以下操作:

 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
于 2012-10-17T11:45:56.047 回答