我正在尝试创建一个数据库触发器,当用户将数据插入表时,该触发器将更新表的字段中的某些字符...
例如
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中要插入的那些行。