web-dev-qa-db-ja.com

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

どこで間違いを犯していますか?

54
priyanka.sarkar

まさにそれが言うこと:

_'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))を使用する必要がある場合があります

92
gbn

両方の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
22
Adriaan Stander

私にとって問題は異なる照合順序にありました。

これだけが私を助けました:

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

それが誰かを助けることを願っています。

5
Vitaly Borisov
;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
4
priyanka.sarkar

私の場合、UNION ALLのtop句とbottom句の列のシーケンスを台無しにしました。そして、varcharカラムがintカラムの「下」にあることがわかりました。簡単な間違いはたくさんのコラムがある

0