SQL Server 2012触发器内更新语句:插入后执行更新查询
插入后自动清理字段引号的After Insert触发器实现方案
你这个触发器的思路很清晰——就是要在数据插入到DEMO表后,自动去掉[DESC]字段开头的双引号。我把你的代码整理成更易读的格式,还补充了一些优化建议:
首先是表的创建语句:
CREATE TABLE DEMO ( MASTERID INT, PRICEINCVAT FLOAT, [DESC] VARCHAR(50) )
插入测试数据的SQL:
INSERT DEMO SELECT 1000001, 25.69, '"Bremsbelagsatz, Scheibenbremse "' UNION ALL SELECT 1000001, 62.58, '"Bremsbelagsatz, Scheibenbremse "'
你的原始触发器代码(已格式化):
CREATE TRIGGER [dbo].[anUpdate] ON [dbo].[DEMO] AFTER INSERT AS SET NOCOUNT ON BEGIN UPDATE [dbo].[DEMO] SET [DESC] = SUBSTRING([DESC], 2, LEN([DESC])) WHERE LEFT([DESC], 1) = '"' END
几点优化建议:
SET NOCOUNT ON这个设置非常实用,它能防止触发器执行时返回额外的行数统计消息,避免干扰调用该插入操作的应用逻辑。- 原始触发器会更新整个表中符合条件的行,如果只需要处理刚插入的记录,建议关联
INSERTED系统临时表,这样能大幅提升效率,尤其是当表数据量很大的时候。因为你的DEMO表没有定义主键,我用所有字段来关联定位插入的行,如果后续给表加了主键,只用主键关联会更准确:
CREATE TRIGGER [dbo].[anUpdate] ON [dbo].[DEMO] AFTER INSERT AS SET NOCOUNT ON BEGIN UPDATE d SET d.[DESC] = SUBSTRING(d.[DESC], 2, LEN(d.[DESC])) FROM [dbo].[DEMO] d JOIN INSERTED i ON d.MASTERID = i.MASTERID AND d.PRICEINCVAT = i.PRICEINCVAT AND d.[DESC] = i.[DESC] WHERE LEFT(d.[DESC], 1) = '"' END
内容的提问来源于stack exchange,提问作者TULSI
相关产品推荐
相关产品推荐

