[SQL] CTE 오류 : "유형 앵커 및 재귀 부분 사이에 일치하지 않습니다"
SQLCTE 오류 : "유형 앵커 및 재귀 부분 사이에 일치하지 않습니다"
나는 다음 문을 실행하고 있습니다 :
;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.정확히 무엇을 말한다 :
정확히 무엇을 말한다 :
"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.당신은 모두 나노 필드를 캐스팅해야
당신은 모두 나노 필드를 캐스팅해야
;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.나에게 문제는 다른 데이터 정렬했다.
나에게 문제는 다른 데이터 정렬했다.
만이 나를 도왔다 :
;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.
;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.내 경우, 나는 상단에 열 및 UNION ALL의 하부 조항의 순서를 엉망. 그리고 그것은 VARCHAR 열이있는 int 하나 '에서'나타난 것으로 밝혀졌다. 쉬운 실수는 열을 많이 가지고 당신을 만들려면
내 경우, 나는 상단에 열 및 UNION ALL의 하부 조항의 순서를 엉망. 그리고 그것은 VARCHAR 열이있는 int 하나 '에서'나타난 것으로 밝혀졌다. 쉬운 실수는 열을 많이 가지고 당신을 만들려면
-
==============================
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.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.
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.
;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
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
'SQL' 카테고리의 다른 글
[SQL] PostgreSQL의에서 작은 따옴표와 큰 따옴표의 차이점은 무엇입니까? (0) | 2020.05.12 |
---|---|
[SQL] SQL 명령 텍스트에서 데이터 집합에 직접 방법 (0) | 2020.05.11 |
[SQL] 오류 메시지 : (공급자 : 공유 메모리 공급자 오류 : 0 - 없음 파이프의 다른 끝에 프로세스가에 있습니다.) (0) | 2020.05.11 |
[SQL] 어떻게 MS 액세스를 위해 SQL의 페이지 매김을 구현합니까? (0) | 2020.05.11 |
[SQL] 자바 스크립트에서 SQL LIKE 에뮬레이션 (0) | 2020.05.11 |