2009-12-03 7 views
46

sto eseguendo la seguente dichiarazione:errore CTE: "Tipi non corrispondono tra l'ancoraggio e la parte ricorsiva"

;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 

... che si conclude con l'errore ...

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". 

Dove sto facendo l'errore?

risposta

78

esattamente ciò che dice:

'name1' ha un diverso tipo di dati per 'name' + CAST((rn+1) as varchar(255))

Prova questo (non testato)

;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 

In sostanza, è necessario garantire la lunghezza corrisponde troppo. Per il bit ricorsivo, potrebbe essere necessario utilizzare CAST('name' AS varchar(4)) se non riesce ancora una volta

+0

Sir, questo è ciò che ho fatto appena. CAST (1 come varchar (255)) –

+0

Ho fatto un errore così stupido ... (: –

+4

ancora una volta Stackoverflow ha risposto alla mia domanda prima di chiederlo. Grazie @priyanka e @gbn –

19

è necessario lanciare sia nm campi

;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

che è ciò che ho appena fatto. 1 come varchar (255)). Un errore stupido ha dimenticato di trasmettere. (: –

+1

dopo aver combattuto con sql, ho finito per convertire entrambi in decimale e ha corretto il mio problema. Thanks! – 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

La tua risposta è proprio come le altre, potresti modificare uno di loro e cancella questo. I futuri lettori come me ti ringrazieranno per la chiarezza;) – 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

Questo è impossibile da leggere senza formattazione corretta. Vedi [Come modifico i miei blocchi di codice] (http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks) – zealoushacker

+1

Probabilmente è un novizio (: ero anche io allo stesso tempo, –

+0

, ho utilizzato la query esatta che hai fornito e mi dà ancora lo stesso errore degli stati delle domande. –

Problemi correlati