2017-05-31 72 views
1

林具有defenition的CTE如下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

消息240,级别16,状态1之间的匹配,步骤f_fetchKeywordVocabullary,行 30递归查询“Paths”的列“P2”中的锚点与 列中的递归部分之间的类型不匹配。

我的转换有什么问题?

回答

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)

+0

哦..好..所以每一处它应该与可变长度匹配..不是吗?谢谢很多人..这是固定的... –