THROW ERROR仍执行查询并将数据插入表中

时间:2016-02-18 05:41:45

标签: sql sql-server throw raiserror

基本上,我试图比较用户将输入的日期以及是否大于今天的日期(GETDATE()),然后它会抛出错误并且不输入数据。查询抛出错误但它仍然输入数据,结果在底部。

USE EMR
GO

IF EXISTS (SELECT DB_ID('CheckDate'))
    DROP TRIGGER CheckDate
    GO

CREATE TRIGGER CheckDate
ON VISIT
AFTER INSERT, UPDATE
AS
BEGIN TRAN
    DECLARE @ErrorMessage VARCHAR(200)
    DECLARE @Date VARCHAR(20) = CAST ((SELECT CONVERT (DATE, GETDATE())) AS VARCHAR(20))
    SET @ErrorMessage = 'Date Must Be On Or Before ' + @Date + '';

    DECLARE @CheckDate DATE = (SELECT Date_Of_Service FROM inserted);

    IF CAST((@CheckDate) AS DATE) <= CAST(GETDATE() AS DATE)
        COMMIT TRAN

    ELSE
        RAISERROR(@ErrorMessage, 1, 1)

这是我的插入声明:

INSERT INTO VISIT (PK_VISIT_ID, Date_Of_Service)
VALUES (02913, '2018-12-03')

得到这个:

Date Must Be On Or Before 2016-02-17
Msg 50000, Level 1, State 1

(1 row(s) affected)

2 个答案:

答案 0 :(得分:1)

您提出severity = 1错误,这意味着服务器只是信息消息

查看对此帖子的回复:{{3} }在msdn。上还有一个指向严重性表的链接。

答案 1 :(得分:0)

您的代码即使在raiserror之后也会执行插入操作,因为插入行的触发器在插入行后会运行触发器。您可以使用check约束或代替insert,如下所示:

{{1}}