T-SQL CTE char()函数的类型与强制转换(as char)不同

T-SQL CTE char()函数的类型与强制转换(as char)不同,sql,tsql,char,Sql,Tsql,Char,我想为chars[a-z]创建一个小型cte。 但是,如果我对递归部分使用char函数,如下所示: with cte(chars) as ( select cast('a' as char) as chars union all select char(ascii(chars) + 1 ) from cte where chars < 'z' ) select * from cte 即使char返回char1,数据类型也不匹配。 但是,如果将char函数强

我想为chars[a-z]创建一个小型cte。 但是,如果我对递归部分使用char函数,如下所示:

with cte(chars)
as (
    select cast('a' as char) as chars
    union all
    select char(ascii(chars) + 1 ) from cte
    where chars < 'z'
)
select *
from cte
即使char返回char1,数据类型也不匹配。 但是,如果将char函数强制转换为char1,它将运行得非常好:

with cte(chars)
as (
    select cast('a' as char) as chars
    union all
    select cast(char(ascii(chars) + 1 ) as char) from cte
    where chars < 'z'
)
select *
from cte
我遗漏了什么吗?

在SQL Server中,永远不要使用没有长度的字符和相关类型。默认长度因上下文而异,谁想跟踪这些内容

以下工作:

with cte(chars) as (
      select cast('a' as char(1)) as chars
      union all
      select char(ascii(chars) + 1 ) from cte
      where chars < 'z'
     )
select *
from cte;

换句话说,强制转换中字符的默认长度与声明中的默认长度不同。

强制转换函数的悬停文本显示为“retruns char1”。这就是为什么我对这个错误感到惊讶。不过,你的回答对我来说完全有道理。谢谢