MS SQL Server触发器执行时报列名或值数量与表定义不匹配
错误原因说明
你遇到的Column name or number of supplied values does not match table definition报错,根因和SQL Server的两个特性有关:
报错行定位偏差
SQL Server在编译触发器、存储过程这类多语句数据库对象时,行号计算偶尔会出现偏移,所以才会把实际发生在insert into Old_titles select * from deleted的错误,误报在前面的insert into Action行上,你排查出的实际错误行是正确的。隐式列匹配的规则问题
使用insert into 表名 select * from 数据源这种写法时,SQL不会做列名匹配,只会严格按列的顺序校验:
要求deleted表(结构和原表titles完全一致)的列数、每一列的顺序和数据类型,和目标表Old_titles完全一致,只要两边列数不同、或者同位置的列数据类型不兼容,就会触发213报错。
你后续修改为显式指定Old_titles插入列名的写法是最佳实践:
insert into Old_titles ( title_id, title, type, pub_id, price, advance, royalty, ytd_sales, notes, pubdate) select * from deleted
这种写法下,只要select子句返回的列数量、数据类型和你指定的插入列一一对应,就不会出现匹配错误,也能避免后续titles表或Old_titles表结构变更后,触发器突然失效的隐患。
内容的提问来源于stack exchange,提问作者NordMan
相关产品推荐
相关产品推荐

