2012-10-17 23 views
0

这给了一个错误如何改变插入的行在SQL Server触发

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

表结构:

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

我想在(CurrencyId, DivisionId, BranchId)来改变0至零。

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 

回答

1

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

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

因此,您的发言是这样的:

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 
1

删除3个END,你有3个IF语句。

到底应该开始一个BEGIN

您有4个S端,只有一个在触发BEGIN

+1

对不起,哥们@marc_s回答是好。 – Star

相关问题