【发布时间】:2014-06-19 04:25:05
【问题描述】:
我正在尝试使用 SQL Server 2012 将一个非常简单的检查集成到触发器中。在 INSTEAD OF 触发器期间,我想根据此伪代码检查以下内容:
IF Inserted.FloorRef = ('various', 'different', 'strings')
THEN check that Inserted.FloorNumber IS NOT NULL
我声明了一个位变量,如果此测试通过或满足 else 条件,则该变量设置为 1,以便可以在已知条件下运行进一步的代码。我的代码在下面,但它失败了: 关键字“CASE”附近的语法不正确(Inserted.FloorRef) 并且; 必须声明标量变量“@Passed”
一定有一个或十个语法错误,但我找不到哪里错了?
DECLARE @Passed BIT = 0
CASE Inserted.FloorRef
WHEN EXISTS IN ('Floor', 'Level', 'Fl', 'L') THEN --FloorNumber is required
CASE Inserted.FloorNumber
WHEN IS NOT NULL THEN --FloorNumber is given
@Passed = 1
ELSE --FloorNumber is required but is missing
@Passed = 0
END;
ELSE --FloorNumber is not required
@Passed = 1
END;
IF @Passed=1
BEGIN
编辑:该解决方案只需要对 Daniel E 的稍作修正,建议的解决方案如下:
SELECT *
,CASE WHEN Inserted.FloorRef IN ('Floor', 'Level', 'Fl', 'L') THEN --FloorNumber is required
CASE
WHEN Inserted.FloorNumber IS NOT NULL THEN 1 --FloorNumber is given
ELSE 0 --FloorNumber is required but is missing
END
ELSE 1 --FloorNumber is not required
END [Passed]
FROM Inserted
【问题讨论】:
-
为什么不在表上设置
CHECK约束而忘记触发器? -
set @passed=CASE...不是...THEN @passed=... -
因为触发器继续使用子查询对其他表中的字段进行检查。我可以将表级检查约束与一个代替触发器结合起来吗...?
-
@Daniel E,这解决了部分问题,现在它注意到“EXISTS IN”(“各种”、“不同”、“字符串”)处的语法不正确。如何将“IN”与“CASE”结合起来?
-
如果您能详细说明您想要强制执行的实际限制条件,我们或许可以提供建议。
标签: sql-server if-statement case