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

San*_*mas 1 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 
)
Run Code Online (Sandbox Code Playgroud)

但它一直在说错误

Msg 240, Level 16, State 1, Procedure f_fetchKeywordVocabullary, Line 30 类型在递归查询“路径”的“P2”列中的锚点和递归部分之间不匹配。

我的转换有什么问题??

Hon*_*ger 5

在递归 CTE 中, 中的类型union all必须完全匹配。因此,如果nvarchar(max)联合的顶部有 an ,则底部的相应属性也必须是nvarchar(max),而不是nvarchar(10)。十进制数据类型也是如此;adecimal(5, 3)与 a 不匹配decimal(15, 3)

当然,当类型不能立即识别时,这会变得更加复杂,尤其是在进行串联和计算时。在这些情况下,您希望将 concat/calculation 包装在 convert 中:CONVERT(DECIMAL(15, 3), T1.DecimalAttribute/T2.DecimalAttribute)CONVERT(NVARCHAR(MAX), T1.Text + T2.Text)