【问题标题】:TSQL - Compare two dates [TRIGGER and IF]TSQL - 比较两个日期 [TRIGGER 和 IF]
【发布时间】:2016-06-27 12:34:30
【问题描述】:

我正在尝试比较两个日期,@DataJogo 和 @DataEvento,并想检查播放日期是否晚于活动日期。

触发器只有在插入有效出现时才起作用,同时选择了 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

感谢您的帮助。

【问题讨论】:

  • inserteddeleted 是表,因此它们可以表示集合操作的结果。假设触发器总是只处理一行,而设计触发器通常是一个糟糕的计划。如果您绝对确定不会超过一排,那么添加对行数的检查,并使用RaIsErrorThrow 明确告知以后来的人他们有试图执行不可接受的语句。 (if ( select Count(*) from inserted ) > 1 RaIsError( 'FooTable_Insert: No more than one row may be processed.', 25, 42 ) with log)

标签: sql sql-server tsql triggers


【解决方案1】:

不要使用触发器执行此操作。使用检查约束执行此操作:

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

如果您想使用触发器执行此操作,那么您应该使用“代替”触发器,并且仅在条件为真时更新/插入表中。

【讨论】:

    【解决方案2】:

    你需要像这样将 ELSE 部分放在 BEGIN...END 块中,

    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
    

    【讨论】:

    • 也正如@Gordon 指出的那样,您不能在触发器中操作调用触发器的同一个表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2011-09-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多