SQL Server递归CTE锚点与递归部分数据类型不匹配原因咨询
递归CTE数据类型不匹配问题解析
我在SQL Server中尝试用递归CTE打印A到Z的字母,最初写的代码如下:
;with alphaCte as ( select 'A' as letter union all select char(ascii(letter)+1) from alphaCte where letter < 'Z' ) select * from alphaCte
执行后触发错误:
递归查询"alphaCte"的列"letter"的锚点和递归部分类型不匹配。
将代码修改为以下形式后即可正常运行:
;with alphaCte as ( select char(ascii('A')) as letter union all select char(ascii(letter)+1) from alphaCte where letter < 'Z' ) select * from alphaCte
错误原因
SQL Server对递归CTE有严格的类型匹配要求:锚点成员和递归成员的对应列必须是完全相同的数据类型。
- 原代码锚点部分的
'A'是**varchar(1)**类型; - 递归部分的
char(ascii(letter)+1)返回的是**char(1)**类型;
这两种字符串类型属于不同的数据类型,因此触发了类型不匹配的错误。
修改后的代码中,锚点部分用char(ascii('A'))显式生成**char(1)**类型的结果,和递归部分的返回类型完全一致,满足了递归CTE的类型要求,所以可以正常执行。
内容的提问来源于stack exchange,提问作者KnowledgeSeeeker
相关产品推荐
相关产品推荐

