我正在尝试创建一个数据库触发器,当用户将数据插入表时,该触发器将更新表的字段中的某些字符...
例如

ID  EXCHANGE   LEADRT
1    new         L-3
2    new         3
3    new         5


所以我想单独留下ID 1,因为LEADRT的格式正确,而ID 2和3却不正确。

CREATE TRIGGER triggerupdate ON PoleUnits FOR INSERT,
UPDATE AS
if not exists (select * from Poleunits where LEADRT like '%L-%')
update PoleUnits set LEADRT = STUFF (LEADRT, 1, 0,'L-');


有什么想法为什么我无法使它起作用,或者有关于如何实现此效果的更好建议?

最佳答案

在插入和更新触发器中,您可以访问名为inserted的特定表,其中保留要插入/更新的行。这些不是真正的表,它们只是逻辑表,其结构与触发触发器的表相同。

您当前的逻辑适用于原始表,因此适用于所有现有数据,但不适用于您实际插入的数据,即它将更新除您实际要更新的数据以外的所有内容。这样的事情可能会起作用:

CREATE TRIGGER triggerupdate ON PoleUnits
FOR INSERT, UPDATE AS
  update PoleUnits
  set LEADRT = STUFF (PoleUnits.LEADRT, 1, 0,'L-')
  from PoleUnits
    inner join inserted  -- this is basically a self join
      on PoleUnits.ID = inserted.ID
  where PoleUnits.LEADRT not like '%L-%'


仅当它们的LEADRT字段不是L-格式时,才更新PoleUnits中要插入的那些行。

10-08 12:49