SQL Server触发器将null替换为“ false”

时间:2018-06-22 00:57:59

标签: sql sql-server tsql triggers

我在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;

2 个答案:

答案 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';