sql-server - 如果同一行中的第 2 列值相同,如何在 SQL Server 中触发触发器?
问题描述
如果连续 2 列的值相同,如何在 SQL Server 中触发触发器?
在我的表中有 3 列id
, capacity
,taken
并且表有一些行。如果taken
等于capacity
,则触发器应触发。我编写了如下所示的触发器,但它说“子查询返回超过 1 个值”——这是不允许的。
ALTER TRIGGER [dbo].[sectionTrigger1]
ON [dbo].[tblTestCapacity]
FOR UPDATE
AS
BEGIN
SET NOCOUNT ON
IF (SELECT (Capacity-SeatTaken) FROM tblTestCapacity) = 0
BEGIN
INSERT INTO tblTest(sectionid, courseid, seatcapacity, seattaken)
SELECT sectionid, courseid, seatcapacity, seattaken
FROM tblTest
END
END
解决方案
在触发器内,您应该使用该inserted
表,该表将保存所有更新的行
可能是这样的?
INSERT INTO tblTest(sectionid, courseid, seatcapacity, seattaken)
SELECT i.sectionid, i.courseid, i.seatcapacity, i.seattaken
FROM inserted i
where (i.Capacity - i.SeatTaken) = 0
注意你不再需要了IF
,因为它已经在WHERE
子句中了
编辑如果您想在可以使用相同查询
时做其他事情(i.Capacity - i.SeatTaken) = 0
if exists ( SELECT i.sectionid, i.courseid, i.seatcapacity, i.seattaken
FROM inserted i
where (i.Capacity - i.SeatTaken) = 0
)
begin
-- do here your code if any row exists with this condition
-- you could for example throw an exception here
THROW 51000, 'your message here.', 1;
end
编辑
如果您的目标是限制表中的 2 列具有相同的值,您还可以添加约束。
这样你甚至不需要触发器
这是最好的选择,如果你只需要防止 2 列具有相同的值
alter table tblTestCapacity
add constraint CH_Doubles check (Capacity <> SeatTaken)
如果两列或一列都可以为空,则必须再添加一点
alter table tblTestCapacity
add constraint CH_Doubles check (isnull(Capacity, -1) <> isnull(SeatTaken, -1))
最后一个alter语句没有测试,不确定sql-server是否允许这个
推荐阅读
- python - Python 和 F-Strings 解释
- google-app-engine - 谷歌云 Flask SQL
- oauth-2.0 - 为什么当我提交有效的访问令牌时,Podio 会返回未经授权的响应?
- javascript - 您可以使用模板字符串作为对象值吗?
- mysql - 使用 Django 将 MySQL 连接到 Heroku 时遇到问题
- python - 提取熊猫 timedelta 实例属性,天
- go - 为什么当一个类型实现一个接口时,行为会有所不同?
- c# - 在 linq c# 中使用 Lambda 表达式时将 Join 转换为 GROUP JOIN
- java - 如何防止在java中刷新后重新提交
- powershell - Jenkins 构建耗时过长