복붙노트

[SQL] CTE 오류 : "유형 앵커 및 재귀 부분 사이에 일치하지 않습니다"

SQL

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

어디에서 실수는 무엇입니까?

해결법

  1. ==============================

    1.정확히 무엇을 말한다 :

    정확히 무엇을 말한다 :

    "NAME1는 '+ CAST'이름 '에 대한 다른 데이터 유형 갖는다 (VARCHAR 등 (RN + 1) (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
    

    기본적으로, 당신은 너무 길이 일치를 보장해야한다. 다시 실패하면 재귀 비트의 경우 (VARCHAR (4) AS '이름') CAST를 사용 할 수 있습니다

  2. ==============================

    2.당신은 모두 나노 필드를 캐스팅해야

    당신은 모두 나노 필드를 캐스팅해야

    ;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
    
  3. ==============================

    3.나에게 문제는 다른 데이터 정렬했다.

    나에게 문제는 다른 데이터 정렬했다.

    만이 나를 도왔다 :

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

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

  4. ==============================

    4.

    ;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
    
  5. ==============================

    5.내 경우, 나는 상단에 열 및 UNION ALL의 하부 조항의 순서를 엉망. 그리고 그것은 VARCHAR 열이있는 int 하나 '에서'나타난 것으로 밝혀졌다. 쉬운 실수는 열을 많이 가지고 당신을 만들려면

    내 경우, 나는 상단에 열 및 UNION ALL의 하부 조항의 순서를 엉망. 그리고 그것은 VARCHAR 열이있는 int 하나 '에서'나타난 것으로 밝혀졌다. 쉬운 실수는 열을 많이 가지고 당신을 만들려면

  6. ==============================

    6.내가 NVARCHAR를 사용하는 것이 좋습니다 (최대)

    내가 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
    
  7. ==============================

    7.CONCAT의 출력 유형이 VARCHAR (MAX)가 있기 때문에 당신이하는 rcte의 재귀 적 관점에서 CONCAT를 사용하는 경우, 당신은 초기 쿼리에서 열을 캐스팅해야합니다

    CONCAT의 출력 유형이 VARCHAR (MAX)가 있기 때문에 당신이하는 rcte의 재귀 적 관점에서 CONCAT를 사용하는 경우, 당신은 초기 쿼리에서 열을 캐스팅해야합니다

    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;
    

  8. ==============================

    8.

    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;
    
  9. ==============================

    9.

    ;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
    
  10. from https://stackoverflow.com/questions/1838276/cte-error-types-dont-match-between-the-anchor-and-the-recursive-part by cc-by-sa and MIT license