2016-06-27 22 views
1

@DataJogoと@DataEventoの2つの日付を比較しようとしていて、再生日がイベントの日付より遅いかどうかを確認します。TSQL - 2つの日付を比較する[トリガーとIF]

トリガは、挿入が有効な場合にのみ機能し、両方がIFを選択すると表示されます。助けのための

CREATE TRIGGER TriValidaData 
ON jogo 
AFTER INSERT, UPDATE 
AS 
DECLARE @DataJogo date, @DataEvento date , @IDJogo int, @IDEvento int 
SELECT @IDJogo = id_jogo FROM inserted 
SELECT @IDEvento = id_evento FROM inserted 
SELECT @DataJogo = data FROM inserted 
SELECT @DataEvento = data FROM evento WHERE id_evento = @IDEvento 
IF @DataJogo > @DataEvento 
    SELECT 'O jogo foi adicionado com sucesso.' AS 'MENSAGEM'; 
ELSE 
    DELETE FROM jogo WHERE id_jogo = @IDJogo; 
    SELECT 'A data não é valida. A inserção de dados não foi efectuada com sucesso.' AS 'MENSAGEM'; 



INSERT INTO jogo VALUES (11,'15:00:00','16:00:00','2018-05-01',3,10,0) 
DELETE FROM jogo WHERE id_jogo = 11; 

IMAGE 1 IMAGE 2

感謝。

+0

'inserted'と' deleted'は、テーブルをしている、このようなBEGIN ... ENDをブロックにELSE部分を配置する必要があります。常に正確に1つの行を処理するという前提でトリガーを設計するのは、一般的には悪い計画です。もしあなたが絶対に確実であれば、複数の行が存在することはありません。そして、行数のチェックを追加し、 'RaIsError'または' Throw'を使って、後に来て、容認できない文を実行しようとしたことを明示します。 1つのRaIsError( 'FooTable_Insert:複数行は処理できません'、25,42)with log') – HABO

答えて

0

あなたは

IF @DataJogo > @DataEvento BEGIN 
    SELECT 'O jogo foi adicionado com sucesso.' AS 'MENSAGEM'; 
END 
ELSE BEGIN 
    DELETE FROM jogo WHERE id_jogo = @IDJogo; 
    SELECT 'A data não é valida. A inserção de dados não foi efectuada com  sucesso.' AS 'MENSAGEM'; 
END 
+0

@Gordonは同じことを操作できないと指摘していますトリガを呼び出すトリガ内のテーブル。 –

1

トリガーでこれを行わないでください。チェック制約でこれを行います。

alter table TriValidaData add constraint chk_TriValidaData_datas 
    check (@DataJogo > @DataEvento); 

あなたは、この使用してトリガを行いたい場合は、あなたは条件が真のときのトリガーと更新のみ「の代わりに」/テーブルに挿入使用する必要があります。彼らは集合演算の結果を表すことができるように

関連する問題