2012-10-17 22 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

相關問題