T-SQL CTE 错误:锚点和递归部分之间的类型不匹配
当我尝试执行特定的递归 CTE 时,出现以下错误:
Msg 240, Level 16, State 1, Line 8
Types don't match between the anchor and the recursive part in column "data_list" of recursive query "CTE".
这是无意义的。每个字段都显式转换为 VARCHAR(MAX)
。 请帮我。我在这里和其他地方读过这个问题的许多答案,所有这些答案都建议明确地转换有问题的专栏。我已经这样做了,但仍然收到错误。
此代码将重现错误:
if object_id('tempdb..#tOwner') IS NOT NULL drop table #tOwner;
CREATE TABLE #tOwner(id int identity(1,1), email varchar(max) );
insert into #towner values ( cast('[email protected]' as varchar(max)));
insert into #towner values ( cast('tsql rage' as varchar(max)));
insert into #towner values ( cast('[email protected]' as varchar(max)));
insert into #towner values ( cast('einstein.x.m' as varchar(max)));
;WITH data AS (
SELECT DISTINCT convert(varchar(max), email) datapoint FROM #tOwner
), CTE ( data_list, datapoint, length ) AS (
SELECT convert(VARCHAR(max), '' ),convert(VARCHAR(max), '' ), 0
UNION ALL
SELECT convert(VARCHAR(max),d.datapoint+';'+data_list),convert(VARCHAR(max),d.datapoint), length + 1
FROM CTE c CROSS JOIN data d WHERE d.datapoint > c.datapoint
)
SELECT D.data_list
FROM (
SELECT data_list, RANK() OVER ( PARTITION BY 1 ORDER BY length DESC )
FROM CTE
) D ( data_list, rank )
WHERE rank = 1 ;
drop table #tOwner;
如果您发现相关,SELECT left(@@VERSION, 70)
返回:
Microsoft SQL Server 2005 - 9.00.4053.00 (X64) May 26 2009 14:13:01
I get the following error when I try to execute a particular recursive CTE:
Msg 240, Level 16, State 1, Line 8
Types don't match between the anchor and the recursive part in column "data_list" of recursive query "CTE".
This is nonsense. Each field is explicitly cast to VARCHAR(MAX)
.
Please help me. I've read many answers to this problem, here and elsewhere, all of which advise explicitly casting the column in question. I'm already doing this, and still get the error.
This code will reproduce the error:
if object_id('tempdb..#tOwner') IS NOT NULL drop table #tOwner;
CREATE TABLE #tOwner(id int identity(1,1), email varchar(max) );
insert into #towner values ( cast('[email protected]' as varchar(max)));
insert into #towner values ( cast('tsql rage' as varchar(max)));
insert into #towner values ( cast('[email protected]' as varchar(max)));
insert into #towner values ( cast('einstein.x.m' as varchar(max)));
;WITH data AS (
SELECT DISTINCT convert(varchar(max), email) datapoint FROM #tOwner
), CTE ( data_list, datapoint, length ) AS (
SELECT convert(VARCHAR(max), '' ),convert(VARCHAR(max), '' ), 0
UNION ALL
SELECT convert(VARCHAR(max),d.datapoint+';'+data_list),convert(VARCHAR(max),d.datapoint), length + 1
FROM CTE c CROSS JOIN data d WHERE d.datapoint > c.datapoint
)
SELECT D.data_list
FROM (
SELECT data_list, RANK() OVER ( PARTITION BY 1 ORDER BY length DESC )
FROM CTE
) D ( data_list, rank )
WHERE rank = 1 ;
drop table #tOwner;
If you find it relevant, SELECT left(@@VERSION, 70)
returns:
Microsoft SQL Server 2005 - 9.00.4053.00 (X64) May 26 2009 14:13:01
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Will A 对我原始帖子的评论找到了关键 - 整理。我发布的查询在主数据库中也对我有用。
检查整理表明我走在正确的轨道上。
后来进行了一些疯狂的搜索,我得到了这个怪物般的代码,它
也就是说:
在我的结果窗口中漂亮地坐着是预期的:
Will A's comment on my original post found the key - the collation. My posted query worked for me in the master database, too.
Examining the collation suggested I was on the right track.
Some frenzied searching later, I had this monstrosity of code, which
To wit:
Sitting beautifully in my results window is the expected: