69

私は次のステートメントを実行しています:

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

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

4

9 に答える 9

115

まさにそれが言うこと:

'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))再度失敗した場合に使用する必要がある場合があります

于 2009-12-03T07:38:42.053 に答える
25

両方の 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
于 2009-12-03T07:40:16.160 に答える
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
于 2009-12-03T07:46:41.023 に答える
0

rcte の再帰項で 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;

ここに画像の説明を入力

于 2019-11-19T15:05:43.103 に答える
-3
;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
于 2015-02-03T06:28:50.727 に答える