SQL触发器仅触发一次问题:批量删除后仅插入单条数据
问题原因
你的触发器只插入第一行数据的核心问题是误用单变量接收批量删除的数据:
SQL Server触发器中的deleted是存储所有被删除记录的临时表,批量删除时它会包含所有被删除行。但你用单个变量@ID去接收BusinessEntityID,变量只能存一个值,执行SELECT @ID = BusinessEntityID FROM deleted时,只会取deleted表第一行的ID,后续行的值会被忽略,最终只插入这一条数据。
修正后的触发器代码
不需要声明单变量,直接用INSERT...SELECT语法一次性插入所有被删除的记录:
CREATE trigger trigger1 ON Sales.SalesPerson FOR DELETE AS BEGIN INSERT INTO dbo.Deleted(ID) SELECT BusinessEntityID FROM deleted PRINT 'TRIGGER' END
关键注意点
- 触发器的
deleted和inserted表都是集合型对象,处理批量增删改操作时,必须用集合式的SQL语句(比如直接SELECT关联),不能用单变量去逐个接收值,否则会丢失批量操作中的大部分数据。 - 确保
dbo.Deleted表的ID字段类型和Sales.SalesPerson表的BusinessEntityID字段类型一致,避免插入时出现类型不匹配的错误。
内容的提问来源于stack exchange,提问作者chr
相关产品推荐
相关产品推荐

