2017-05-31 38 views
1

イム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言い続けるようdefenitionでCTEを持つの間の一致をいけない言い続け、プロシージャf_fetchKeywordVocabullary、行 再帰的クエリ "パス"の列 "P2"のアンカーと再帰部分の型が一致しません。

私の変換には何が問題ですか?

答えて

3

再帰的なCTEでは、union allのタイプはと正確にはに一致する必要があります。したがって、ユニオンの上部にnvarchar(max)がある場合、下部の対応するアトリビュートもnvarchar(max)でなく、nvarchar(10)でなければなりません。 10進数のデータ型も同じです。 decimal(5, 3)decimal(15, 3)と一致しません。

これはもちろん、タイプがすぐに特定できない場合、特に連結や計算を行う際に、より複雑になります。そのような場合は、コンバート/コンバートを変換でラップしたいとします。またはCONVERT(NVARCHAR(MAX), T1.Text + T2.Text)

+0

ああ.. ..可変長と一致する必要がある場所はどこですか?ありがとう、多くの男..それは固定されている... –