我的CTE定义如下
;With Paths as (
select s.ID as RootID,t.subject_ID,t.Parent_ID ,t.text, CONVERT(nvarchar(max),t.text) as Path,convert(nvarchar(max),t.subject_ID) as P2
from
@search s
inner join
SubjectHierarchy t
on
s.ID = t.subject_ID
union all
select p.RootID,t.subject_ID,t.Parent_ID,p.text, t.text + '$' + p.Path,convert(nvarchar(10),t.subject_ID) + '$' + convert(nvarchar(10),p.P2)
from Paths p
inner join
SubjectHierarchy t
on
p.Parent_ID = t.subject_ID
)
但它一直在说erorr
Msg 240,Level 16,State 1,Procedure f_fetchKeywordVocabullary,Line 30种类型在锚点和递归部分之间不匹配 栏" P2"递归查询"路径"。
我的转换错误了吗?
答案 0 :(得分:3)
在递归CTE中,union all
中的类型必须与完全匹配。因此,如果联合的顶部有nvarchar(max)
,则底部的相应属性也必须是nvarchar(max)
,而不是nvarchar(10)
。十进制数据类型也是如此; decimal(5, 3)
与decimal(15, 3)
不匹配。
当类型无法立即识别时,这当然会变得更加复杂,特别是在进行连接和计算时。在这些情况下,您希望将转换/计算包装在转换中:CONVERT(DECIMAL(15, 3), T1.DecimalAttribute/T2.DecimalAttribute)
或CONVERT(NVARCHAR(MAX), T1.Text + T2.Text)