2017-01-19 39 views
0

単純なトリガを作成しようとしていて、SQL Server Management Studioのテンプレートを使用しました。私はすでに広範な検索を行い、解決策を見つけることができませんでした。私は、ポルトガル語で書かれているテキストについてはお詫びしますが、データベースは同じ言語です。SQL:Msg 156、レベル15、状態1、プロシージャUA_TRIGGER_PAGAMENTO、15行目キーワード 'THEN'の近くの構文が正しくありません

CREATE TRIGGER dbo.UA_TRIGGER_PAGAMENTO 
ON dbo.PagamentoSet 
AFTER UPDATE 
AS 
    DECLARE @vEstado VARCHAR(20); 
    DECLARE @vIdSocio INT; 
BEGIN 
    SET NOCOUNT ON; 

    SET @vEstado = (SELECT Estado FROM inserted); 
    SET @vIdSocio = (SELECT Socio_Id FROM inserted); 

    IF (@vEstado = 'PAGO') THEN 
     UPDATE SocioSet 
     SET Atualizado = 'True' 
     WHERE Id = @vIdSocio; 
    END IF; 
END 
GO 

私はそれを実行しようとすると、私は次のエラーを取得:

メッセージ156、レベル15、状態1、プロシージャUA_TRIGGER_PAGAMENTO、ライン15
不適切な構文 'を' キーワードの近くには。

レベル15、状態1、プロシージャUA_TRIGGER_PAGAMENTO、行23
キーワード 'END'の近くに構文が正しくありません。

私は既にBEGIN-ENDの中で変数を宣言しようとしました。セミコロンを入れないようにしました。そして何も。

はあなたに

+2

[IF ... ELSE](https://msdn.microsoft.com/en-GB/library/ms182717.aspx)(「THEN」キーワードには注意してください)。 [BEGIN ... END](https://msdn.microsoft.com/en-gb/library/ms190487.aspx)(「END IF」ではなく)。あなたのトリガは壊れています - 'inserted'は0、1、または*複数の行を含むことができます。 –

+1

あなたのトリガーには**メジャー**の欠陥があります。**行ごとに** **一度**と呼ばれると思われるようです。トリガは**文ごとに** **起動します。したがって、 'UPDATE'文が25行に影響を与えると、トリガは一度**発生しますが、' Inserted'と 'Deleted'はそれぞれ25行。これらの25行のうち、あなたのコードはここで選択されますか? 'SELECT Estado FROM inserted' - 非決定論的です。これを考慮に入れてトリガーを書き直す必要があります。 –

答えて

0

注意をありがとうございます。SQLサーバーでのトリガはない、行ごとに、ステートメントごとに発射されています。これは、挿入されたテーブルに複数の値が含まれる可能性があることを意味しますこの場合、現在のトリガーでエラーが発生します(サブクエリは1つ以上の値を返しました)。

CREATE TRIGGER dbo.UA_TRIGGER_PAGAMENTO 
ON dbo.PagamentoSet 
AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

     UPDATE t 
     Set Atualizado = 'True' 
     FROM SocioSet t 
     INNER JOIN inserted i ON t.Id = i.Socio_Id 
     WHERE t.Estado = 'PAGO'; 

END 
GO 

また、今後の参考のために、正しい方法は、SQLで他の条件はすでに

IF condition 
BEGIN 
    -- statements 
END 
[ELSE 
BEGIN 
    -- statements 
END] 
関連する問題