Programing

CTE 오류 : "앵커와 재귀 부분간에 유형이 일치하지 않습니다."

crosscheck 2020. 12. 29. 07:39
반응형

CTE 오류 : "앵커와 재귀 부분간에 유형이 일치하지 않습니다."


다음 진술을 실행하고 있습니다.

;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

... 오류와 함께 완료됩니다 ...

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

내가 실수하는 곳은 어디입니까?


정확히 말한 내용 :

'name1' 데이터 유형이 다릅니다. 'name' + CAST((rn+1) as varchar(255))

이것을 시도하십시오 (예상되지 않음)

;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

기본적으로 길이도 일치하는지 확인해야합니다. 재귀 비트의 CAST('name' AS varchar(4))경우 다시 실패하면 사용해야 할 수 있습니다.


두 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

나에게 문제는 다른 데이터 정렬에있었습니다.

이것은 나에게 도움이되었습니다.

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

다른 사람을 도울 수 있기를 바랍니다.


;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

제 경우에는의 상단 및 하단 절에서 열 시퀀스를 엉망으로 만들었습니다 UNION ALL. 그리고 varchar기둥이 int하나의 '아래'에 나타났습니다 . 많은 열이 있다는 쉬운 실수


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

;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

ReferenceURL : https://stackoverflow.com/questions/1838276/cte-error-types-dont-match-between-the-anchor-and-the-recursive-part

반응형