programing

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

topblog 2023. 7. 2. 18:57
반응형

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하나. 당신이 많은 칼럼을 가지고 있다고 생각하기 쉬운 실수.

반복적인 arct 용어로 CONCAT를 사용하는 경우, CONCAT의 출력 유형은 varchar(MAX)이므로 초기 쿼리에서 열만 캐스트하면 됩니다.

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

nvarchar(최대) 사용을 권장합니다.

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

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

반응형