0

これによりエラーが発生しました

メッセージ 156、レベル 15、状態 1、プロシージャ Trig_Insert_Serials_Null、行 30
キーワード「INSERT」付近の構文が正しくありません。

テーブル構造:

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

( ) 内の 0 を null に変更したいCurrencyId, DivisionId, BranchId

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と1つのBEGINしかありません

于 2012-10-17T11:43:09.107 に答える
1

トリガーは行ごとに 1 回起動されると想定していますが、これは誤りです。

トリガーはバッチごとに 1 回INSERT起動され、 50 行を挿入する 1 つのステートメントに対して起動される可能性があります。

したがって、次のようなステートメント:

SELECT @currencyId = INSERTED.CurrenceyId FROM INSERTED;

見事に失敗します。

これを考慮してトリガーを書き直す必要があります.Insertedテーブルには1つまたは複数の行を含めることができます.常に単一の行であると単純に仮定することはできません.

基本的に、次のようなことをする必要があります。

 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 に答える