CTE递归查询锚点与递归段ParentTitle字段类型不匹配报错求助
解决CTE递归查询中的类型不匹配错误(Msg 240)
这个坑我之前也踩过!看起来你已经把递归CTE的逻辑搭好了,但SQL Server在递归CTE的类型匹配上有个严格要求——锚点成员和递归成员的对应列必须完全一致,不仅是数据类型,连长度都不能有差异。
你这里的问题出在ParentTitle列:
- 锚点部分你用
''初始化,SQL Server会默认把它解析成varchar(1)类型; - 递归部分你赋值的
t2.title是表中的实际字段,它的长度肯定远大于1(比如常见的varchar(255)或者更长),两者长度不匹配就触发了Msg 240错误。
解决方法很简单,只需要在锚点成员里显式指定ParentTitle的类型长度,和title字段的实际长度保持一致就行。比如假设你的title是varchar(255),修改后的代码如下:
;with cte(wtype,id,parent,title,ptype,WILevel,ParentTitle) as ( select WorkItemType, wi_id, parent, title, ParentType, 0 as WILevel, CAST('' AS varchar(255)) as ParentTitle -- 显式匹配title字段的长度 from tbl_VSTS_AllWorkItems where Parent is null and state<>'Removed' union all select WorkItemType, wi_id, W.parent, W.title, ParentType=t2.wtype, (t2.WILevel+1) as WILevel, t2.title as ParentTitle from tbl_VSTS_AllWorkItems W inner join cte t2 on t2.id=W.Parent where state<>'Removed' ) select * from cte where WILevel=0;
注意:你需要把varchar(255)替换成你表中title字段的真实长度。可以通过查看表结构,或者执行下面的查询来确认:
SELECT CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tbl_VSTS_AllWorkItems' AND COLUMN_NAME = 'title';
这样修改后,锚点和递归部分的ParentTitle类型就完全一致了,错误应该就能解决。
内容的提问来源于stack exchange,提问作者Sandeep Thomas
相关产品推荐
相关产品推荐

