web-dev-qa-db-fra.com

Erreur 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?

54
priyanka.sarkar

Exactement ce qu'il dit:

'name1' A un type de données différent de 'name' + CAST((rn+1) as varchar(255))

Essayez ceci (non testé)

;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

Fondamentalement, vous devez également vous assurer que la longueur correspond. Pour le bit récursif, vous devrez peut-être utiliser CAST('name' AS varchar(4)) s'il échoue à nouveau

92
gbn

Vous devez lancer les deux champs 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
22
Adriaan Stander

Pour moi, le problème était dans un classement différent.

Seulement cela m'a aidé:

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

J'espère que cela peut aider quelqu'un d'autre.

5
Vitaly Borisov
;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
priyanka.sarkar

Dans mon cas, j'ai foiré la séquence de colonnes dans les clauses haut et bas de UNION ALL. Et il s'est avéré qu'une colonne varchar apparaissait "sous" une int. Une erreur facile à faire car vous avez beaucoup de colonnes

0
BusinessAlchemist