我在SQL Server 2017数据库中有一个包含2个numeric
列和3个varchar
列的表。我希望触发器检查每个插入/更新的行,并且当任何varchar
列包含文本“ false”时,将其替换为NULL
。
没有主键列,并且每一列都可以为空,因此我将无法与“插入的”伪表连接。
我更熟悉Oracle,其中的逻辑可能类似于:
BEFORE INSERT OR UPDATE ON table1
FOR EACH ROW
BEGIN
IF new.TEXT_COLUMN1 = 'false' THEN new.TEXT_COLUMN1 := null; END IF;
IF new.TEXT_COLUMN1 = 'false' THEN new.TEXT_COLUMN1 := null; END IF;
IF new.TEXT_COLUMN1 = 'false' THEN new.TEXT_COLUMN1 := null; END IF;
END;
答案 0 :(得分:1)
您最好的选择是 INSTEAD OF 触发器。一般的想法是,它将拦截您的插入,并且实际上根本不会插入任何行...除非您告知。
当您告诉它时,您可以进行替换。要实际插入行,只需在 INSTEAD OF 触发器内使用一些插入语句。不用担心,它不会递归。
create trigger ReplaceFalseTrigger on table1 instead of insert as
insert into table1 (TEXT_COLUMN1)
select
case when TEXT_COLUMN1='false' then null else TEXT_COLUMN1 end
from inserted;
这就是要点。我将它留给您添加其他所有神秘的列。
答案 1 :(得分:0)
更像是这样:
update t -- table being inserted into
set TEXT_COLUMN1 = null
from inserted i join
t
on t.id = i.id
where t.TEXT_COLUMN1 = 'false';