CTE不能用于反转字符串

时间:2015-02-20 07:23:13

标签: sql-server-2008-r2

我正在使用sql server 2008 R2,目前我正在学习SQL。最近我尝试使用CTE来反转一个字符串,但我收到错误 -

键入col" Val"中的锚点和递归部分之间的匹配。递归查询" CTE"

我使用下面提到的代码 -

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

有人可以告诉我,我在这里做错了为什么我得到的类型不匹配错误

2 个答案:

答案 0 :(得分:2)

试试这个:

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

或者

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

问题是VARCHAR(10)其类型与表达式val + SUBSTRING(@string, ln - 1, 1)的类型不匹配,即VARCHAR(1)VARCHAR(2) ......

使用VARCHAR(MAX)val + SUBSTRING(@string, ln - 1, 1)的类型也是VARCHAR(MAX)

答案 1 :(得分:0)

如果您只想反转字符串,请使用:

DECLARE @string VARCHAR(10) = 'mystring'    

SELECT REVERSE(@string)