Sql server 2008 r2 CTE不适用于反转字符串

Sql server 2008 r2 CTE不适用于反转字符串,sql-server-2008-r2,Sql Server 2008 R2,我正在使用SQLServer2008R2,目前正在学习sql。最近,我尝试使用CTE反转字符串,但我得到的错误如下- 递归查询“CTE”列“Val”中的锚定和递归部分之间的类型不匹配 我使用下面提到的代码- declare @string varchar(10) = 'mystring' with cte as ( select right(@string,1) as val, len(@string) as ln union all select val + substring(@st

我正在使用SQLServer2008R2,目前正在学习sql。最近,我尝试使用CTE反转字符串,但我得到的错误如下-

递归查询“CTE”列“Val”中的锚定和递归部分之间的类型不匹配

我使用下面提到的代码-

declare @string varchar(10) = 'mystring'   

with cte as (
select right(@string,1) as val, len(@string) as ln
union all
select val + substring(@string,ln-1,1),ln-1
where ln > 0
)
select * from cte

有人能告诉我我在这里做错了什么吗?为什么我得到类型不匹配错误?如果您只想反转字符串,请使用:

DECLARE @string VARCHAR(10) = 'mystring'    

SELECT REVERSE(@string)
试试这个:

DECLARE @string VARCHAR(10) = 'mystring';

WITH    cte ( val, ln )
          AS ( SELECT   CAST(RIGHT(@string, 1) AS NVARCHAR(MAX)) AS val ,
                        LEN(@string) AS ln
               UNION ALL
               SELECT   val + SUBSTRING(@string, ln - 1, 1) ,
                        ln - 1
               FROM     cte
               WHERE    ln > 0
             )
    SELECT  *
    FROM    cte

问题是
VARCHAR(10)
其类型与表达式
val+子字符串(@string,ln-1,1)
的类型不匹配,后者是
VARCHAR(1)
VARCHAR(2)

使用
VARCHAR(MAX)
时,
val+子字符串(@string,ln-1,1)
的类型也是
VARCHAR(MAX)

DECLARE @string VARCHAR(MAX) = N'mystring';

WITH    cte ( val, ln )
          AS ( SELECT   RIGHT(@string, 1) AS val ,
                        LEN(@string) AS ln
               UNION ALL
               SELECT   val + SUBSTRING(@string, ln - 1, 1) ,
                        ln - 1
               FROM     cte
               WHERE    ln > 0
             )
    SELECT  *
    FROM    cte