使用没有 else 分支的 if/else 语句

Use if/else statement without else branch

我不知道在这种情况下如何使用 if else。当分数 > 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

首先,创建这些类型的 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

要使此触发器起作用,您需要更改 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

'Else' 是一个选项部分,您可以删除它并使用它,但我可能希望您考虑对此类场景使用检查约束,而不是在得分列

上添加触发检查

例如 创建 TABLE dbo.dbo_score(

Score int CHECK (score < 10)

);

CHECK 约束更快、更简单、更便携、需要更少的代码并且不易出错