You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:24:03