首页 > 解决方案 > 如果同一行中的第 2 列值相同,如何在 SQL Server 中触发触发器?

问题描述

如果连续 2 列的值相同,如何在 SQL Server 中触发触发器?

在我的表中有 3 列id, capacitytaken并且表有一些行。如果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

标签: sql-server

解决方案


在触发器内,您应该使用该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是否允许这个


推荐阅读