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