使用if / else语句而不使用else分支

时间:2019-11-25 02:43:04

标签: sql-server tsql if-statement database-trigger

在这种情况下,我不知道如何使用。当得分> 10时,停止插入。否则继续照常插入。但是,这样做的语法是什么?

CREATE TRIGGER invalidScore ON dbo.dbo_score
AFTER INSERT
AS
DECLARE @score DECIMAL;
SET @score = (SELECT s.score FROM Inserted s);
IF(@score > 10)
BEGIN
  RETURN 'score must be less than 10'
  ROLLBACK TRAN
END
ELSE
BEGIN
END

3 个答案:

答案 0 :(得分:1)

首先,创建这些类型的sql对象应使用begin.. end块。其次,您可以忽略else语句。

CREATE TRIGGER invalidScore ON dbo.dbo_score
AFTER INSERT
AS
BEGIN
    DECLARE @score DECIMAL;
    SET @score = (SELECT s.score FROM Inserted s);
    IF(@score > 10)
        BEGIN
            RETURN 'score must be less than 10'
            ROLLBACK TRAN
        END
END

答案 1 :(得分:1)

要使此触发器起作用,您需要更改3件事:

  1. 删除else部分-其可选部分。
  2. 处理Inserted可能有多行的事实。
  3. Throw错误,而不是使用return语句,以便您可以在客户端中进行处理。并在回滚进行中的事务后将其丢弃。

正确的触发器如下:

create trigger invalidScore on dbo.dbo_score
after insert
as
begin
  if exists (select 1 from Inserted S where S.Score > 10) begin
    rollback tran;
    throw 51000, 'score must be less than 10', 1;
  end
end

答案 2 :(得分:0)

“其他”是一个选项部分,您可以删除它并使用它,但我可能希望您考虑对这种情况使用检查约束,而不是在得分列上添加触发检查

例如 创建表dbo.dbo_score(

Score int CHECK (score < 10)

);

CHECK约束更快,更简单,更可移植,需要更少的代码并且更不容易出错