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?
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
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
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.
;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
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