CTE错误:"锚点和递归部分之间的类型不匹配"

pri*_*kar 56 sql t-sql sql-server common-table-expression

我正在执行以下声明:

;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
Run Code Online (Sandbox Code Playgroud)

...完成错误...

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".
Run Code Online (Sandbox Code Playgroud)

我在哪里弄错了?

gbn*_*gbn 93

它究竟是什么意思:

'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
Run Code Online (Sandbox Code Playgroud)

基本上,你必须确保长度匹配.对于递归位,CAST('name' AS varchar(4))如果再次失败,则可能必须使用

  • 在我问之前,Stackoverflow再次回答了我的问题.谢谢@priyanka和@gbn (6认同)
  • 以防万一,如果仍然出现该错误,还应确保数据库的排序规则和表的排序规则相同.换句话说,在CTE递归查询中,排序规则应该相同. (5认同)

Adr*_*der 22

您需要投射两个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
Run Code Online (Sandbox Code Playgroud)


Vit*_*sov 6

对我来说,问题出在不同的排序规则中。

只有这帮助了我:

;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;
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助别人。