CTE一直说类型不匹配锚和递归部分

时间:2017-05-31 07:55:33

标签: sql sql-server common-table-expression

我的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"递归查询"路径"。

我的转换错误了吗?

1 个答案:

答案 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)