74 votes

Erreur de CTE : "Les types ne correspondent pas entre l'ancre et la partie récursive"

J'exécute la déclaration suivante :

;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

...qui se termine par l'erreur...

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

Où est-ce que je fais l'erreur ?

1voto

user3046585 Points 1

Si vous utilisez CONCAT dans le terme récursif d'un rcte, étant donné que le type de sortie de concat est varchar(MAX), vous ne devez effectuer le casting de la colonne que dans la requête initiale :

WITH rcte AS (
    SELECT 1 AS nr, CAST('1' AS varchar(MAX)) AS trail
    UNION ALL
    SELECT nr+1, CONCAT(trail, '/', nr+1)
    FROM rcte
    WHERE nr < 5
)
SELECT * FROM rcte;

enter image description here

0voto

Je recommande d'utiliser nvarchar(max)

WITH CTE AS (
SELECT x,x_name FROM (VALUES (1,CAST('' AS nvarchar(MAX)))) AS     test(x,x_name)
UNION ALL
SELECT x + 1 x, CONCAT(x_name,x+1)  FROM CTE WHERE x < 10 )
SELECT * FROM CTE

0voto

WITH rcte AS (
    SELECT 1 AS nr, CAST('1' AS varchar(MAX)) AS trail
    UNION ALL
    SELECT nr+1, cast(CONCAT(trail, '/', nr+1) as varchar(max))
    FROM rcte
    WHERE nr < 5
)
SELECT * FROM rcte;

0 votes

Au lieu de poster la seule réponse au code, veuillez expliquer le contexte en quoi cette réponse va aider

0 votes

Cela donnera la sortie ci-dessus sans aucune erreur. comme si vous exécutez la requête ci-dessus, il vous donnera une erreur dans sql. donc j'ai utilisé la fonction cast pour le rendre sans erreur.

-4voto

Gajendra Singh Points 5
;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 votes

C'est impossible à lire sans un formatage correct. Voir Comment formater mes blocs de code

1 votes

Il s'agit probablement d'un nouveau venu ( : Je l'étais aussi à une époque

0 votes

J'ai utilisé la requête exacte que vous avez fournie et cela me donne toujours la même erreur que la question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X