SQL Server临时表插入报错:列值与表定义不匹配问题排查
问题:SQL Server临时表插入报错“Column name or number of supplied values does not match table definition”
我需要在SQL Server的查询中使用临时表存储CTE的结果,方便后续复用。原本的CTE查询可以正常返回结果:
;WITH cte AS ( SELECT ID, g.Name FROM game.Game g WITH(NOLOCK) WHERE ID IN (SELECT Data FROM system.Split(1, ',')) UNION ALL SELECT g.ID, g.Name FROM game.Game g WITH(NOLOCK) JOIN cte ON g.ParentID = cte.ID ) SELECT c.ID, c.Name FROM cte c INNER JOIN list.Type gt WITH(NOLOCK) ON c.TypeId = gt.TypeID WHERE c.ID NOT IN (SELECT Data FROM system.Split(1, ',')) AND c.ID IN ( SELECT ID FROM game.code WITH(NOLOCK) WHERE ID = c.ID AND StatusCode IN ('OP', 'CL', 'SU') AND isDisplay = 'True' AND GETDATE() BETWEEN DisplayStart AND DisplayEnd AND GETDATE() < ISNULL(ResultDateTime, ResultExpected) )
这段查询返回的结果集为:
ID | Name 1111 | BaseBall 2222 | BasketBall 45896 | Relay
之后我尝试创建临时表并插入上述结果,代码如下:
Create Table #temp( ID int, Name varchar ) ;WITH cte AS ( SELECT ID, g.Name FROM game.Game g WITH(NOLOCK) WHERE ID IN (SELECT Data FROM system.Split(1, ',')) UNION ALL SELECT g.ID, g.Name FROM game.Game g WITH(NOLOCK) JOIN cte ON g.ParentID = cte.ID ) insert into #temp -- 我想把查询结果存入临时表 SELECT c.ID, c.Name FROM cte c INNER JOIN list.Type gt WITH(NOLOCK) ON c.TypeId = gt.TypeID WHERE c.ID NOT IN (SELECT Data FROM system.Split(1, ',')) AND c.ID IN ( SELECT ID FROM game.code WITH(NOLOCK) WHERE ID = c.ID AND StatusCode IN ('OP', 'CL', 'SU') AND isDisplay = 'True' AND GETDATE() BETWEEN DisplayStart AND DisplayEnd AND GETDATE() < ISNULL(ResultDateTime, ResultExpected) )
但每次执行都会报错:Column name or number of supplied values does not match table definition.,明明我传入的两个值和临时表的两列是对应的,请问问题出在哪里?
解答
这个报错的根源在临时表的Name列定义上:你写的Name varchar没有指定长度,在SQL Server中,未指定长度的varchar会默认被识别为varchar(1)——也就是只能存储1个字符。
而你的查询返回的Name列值(比如BaseBall、BasketBall)长度远大于1,插入时就会因为字段长度不匹配触发这个错误,看起来像是列数不对,但实际是字段定义的问题。
修正后的临时表创建语句应该指定合适的长度(建议和game.Game表中Name列的长度保持一致,或者根据业务需求设置,比如varchar(255)):
Create Table #temp( ID int, Name varchar(255) -- 这里指定符合业务需求的长度 )
另外还有个小细节:SQL Server的单行注释应该用--,你代码里的//是其他语言的注释方式,虽然不影响报错,但建议统一成SQL规范的注释写法。
调整完临时表的字段定义后,再执行插入操作就可以正常运行了。
内容的提问来源于stack exchange,提问作者maryjane
相关产品推荐
相关产品推荐

