使用没有 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 项内容:
- 删除
else
部分 - 它是可选的。
- 处理
Inserted
可能有多行的事实。
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 约束更快、更简单、更便携、需要更少的代码并且不易出错
我不知道在这种情况下如何使用 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 项内容:
- 删除
else
部分 - 它是可选的。 - 处理
Inserted
可能有多行的事实。 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 约束更快、更简单、更便携、需要更少的代码并且不易出错