私は次の文を実行しています:
;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
のtop句とbottom句の列のシーケンスを台無しにしました。そして、varchar
カラムがint
カラムの「下」にあることがわかりました。簡単な間違いはたくさんのコラムがある