2009-12-03 9 views
46

Estoy ejecutando la siguiente declaración:de error CTE: "Tipos no coinciden entre el anclaje y la parte recursiva"

;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 

... que acaba con el error ...

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

¿Dónde estoy cometiendo el error?

Respuesta

78

exactamente lo que dice:

'name1' tiene un tipo de datos diferente a 'name' + CAST((rn+1) as varchar(255))

Prueba esto (no probado)

;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 

Básicamente, usted tiene que asegurarse la longitud coincide también. Para el bit recursiva, puede que tenga que utilizar CAST('name' AS varchar(4)) si vuelve a fallar

+0

señor, eso es lo que acaba de haberlo hecho. CAST (1 como varchar (255)) –

+0

He cometido un error tan tonto ... (: –

+4

una vez más Stackoverflow ha respondido a mi pregunta antes de preguntar. Gracias @priyanka y @gbn –

19

, es necesario especificar tanto nm campos

;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

eso es lo que acabo de hacer. 1 como varchar (255)). Un error tonto se olvidó de emitir. (: –

+1

después de luchar con sql, terminé convirtiendo ambos a decimal y solucionó mi problema. ¡Gracias! – 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

Su respuesta es como las otras, puede editar uno de ellos y eliminar esto. Los futuros lectores como yo le agradeceremos por la claridad;) – 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

Esto es imposible de leer sin el formato correcto. Ver [Cómo formatear mis bloques de código] (http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks) – zealoushacker

+1

Probablemente él es un novato (: yo también estaba al mismo tiempo –

+0

He estado usando la consulta exacta que me proporcionó y todavía me da el mismo error que los estados de la pregunta. –

Cuestiones relacionadas