2009-12-03 6 views
46

ich die folgende Anweisung ausführen „Typen nicht zwischen dem Anker und dem rekursiven Teil passen“:CTE Fehler:

;WITH cte AS (
    SELECT 
    1 as rn, 
    'name1' as nm 
    UNION ALL 
    SELECT 
    rn + 1, 
    nm = 'name' + CAST((rn + 1) as varchar(255)) 
    FROM cte a WHERE rn < 10) 
SELECT * 
FROM cte 

..., die mit dem Fehler beendet ...

Msg 240, Level 16, State 1, Line 2 
Types don't match between the anchor and the recursive part in column "nm" of recursive query "cte". 

Wo mache ich den Fehler?

Antwort

78

Genau das, was es sagt:

'name1' einen anderen Datentyp 'name' + CAST((rn+1) as varchar(255))

hat Versuchen Sie, diese (nicht getestet)

;with cte as 
(
select 1 as rn, CAST('name1' as varchar(259)) as nm 
union all 
select rn+1,nm = 'name' + CAST((rn+1) as varchar(255)) 
from cte a where rn<10) 
select * from cte 

Grundsätzlich müssen Sie die Länge gewährleisten zu übereinstimmt. Für die rekursive Bit, können Sie CAST('name' AS varchar(4)) verwenden, wenn es wieder

+0

Sir Felder, das ist, was gerade das habe ich. CAST (1 als varchar (255)) –

+0

Ich machte so einen dummen Fehler ... (: –

+4

noch einmal Stackoverflow hat meine Frage beantwortet, bevor ich es frage. Danke @priyanka & @ gbn –

19

nicht benötigen Sie beide zu werfen nm

;with cte as 
(
select 1 as rn, 
     CAST('name1' AS VARCHAR(255)) as nm 
union all 
select rn+1, 
     nm = CAST('name' + CAST((rn+1) as varchar(255)) AS VARCHAR(255)) 
from cte a where rn<10) 
select * from cte 
+0

das ist, was ich gerade getan habe. 1 als varchar (255)). Ein dummer Fehler vergaß zu casten. (: –

+1

nach dem Kampf mit Sql, ich konvertierte beide in Dezimal und es behoben mein Problem. Danke! – SheldonH

4
;with cte as 
(
select 1 as rn, 'name' + CAST(1 as varchar(255)) as nm 
union all 
select rn+1,nm = 'name' + CAST((rn+1) as varchar(255)) 
from cte a where rn<10) 
select * from cte 
+4

Ihre Antwort ist genau wie die anderen, könnten Sie bearbeiten einer von ihnen und löschen Sie das. Zukünftige Leser wie ich werden Ihnen für die Klarheit danken;) – bluish

-2
;with tmp1(NewsId,DataItem ,HeaderText) 
as 
    (

    select NewsId, LEFT(HeaderText, CHARINDEX(',',HeaderText+',')-1), 
    STUFF(HeaderText, 1, CHARINDEX(',',HeaderText+','), '') 
    from Currentnews 

    union all 

    select NewsId, LEFT(HeaderText, CHARINDEX(',',HeaderText+',')-1), 
    STUFF(HeaderText, 1, CHARINDEX(',',HeaderText+','), '') 
    from tmp1 
    where HeaderText > '' 

    ) 

    select NewsId, DataItem 
    from tmp1 
    order by NewsId 
+0

Dies ist unmöglich ohne zu lesen richtige Formatierung. Siehe [Wie formatiere ich meine Code-Blöcke] (http://meta.stackexchange.com/questions/22186/how-doi-i-format-my-code-blocks) – zealoushacker

+1

Wahrscheinlich ist er ein Neuling (: Ich war auch zu einer Zeit –

+0

Ich habe die genaue Abfrage verwendet, die Sie angegeben haben, und es gibt mir immer noch den gleichen Fehler wie Frage Staaten. –