반응형
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;
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
반응형
'programing' 카테고리의 다른 글
sqlalchemy가 NULL이 아닙니다. 선택 (0) | 2023.07.02 |
---|---|
오류 유형 3 오류:활동 클래스 {}이(가) 없습니다. (0) | 2023.07.02 |
UIGesture Recognizer를 여러 뷰에 첨부할 수 있습니까? (0) | 2023.07.02 |
Debug 모드에서 Spring Boot이 H2 콘솔을 차단하고 있습니다. (0) | 2023.07.02 |
마우스 이동 시 업데이트되는 Vue.js 구성 요소 간의 상태 공유 (0) | 2023.07.02 |