T-SQL CTE错误:锚点和递归部分之间的类型不匹配

Ein*_*ery 10 t-sql recursion sql-server-2005 common-table-expression

当我尝试执行特定的递归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".
Run Code Online (Sandbox Code Playgroud)

这是无稽之谈.每个字段都明确地转换为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('123@123.321'  as varchar(max)));
insert into #towner values ( cast('tsql rage'    as varchar(max)));
insert into #towner values ( cast('another@e.c'  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;
Run Code Online (Sandbox Code Playgroud)

如果您发现它相关,则SELECT left(@@VERSION, 70)返回:

Microsoft SQL Server 2005 - 9.00.4053.00 (X64)   May 26 2009 14:13:01 
Run Code Online (Sandbox Code Playgroud)

Ein*_*ery 11

A对我原帖的评论找到了关键 - 整理.我发布的查询也在master数据库中为我工作.

检查整理表明我走在正确的轨道上.

SELECT DATABASEPROPERTYEX('crm_mscrm', 'Collation') crmSQLCollation
crmSQLCollation
--------------------
Latin1_General_CI_AI
(1 row(s) affected)

SELECT DATABASEPROPERTYEX('master', 'Collation') masterSQLCollation
masterSQLCollation
----------------------------
SQL_Latin1_General_CP1_CI_AS
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

有些疯狂的搜索后来,我有这个怪异的代码,这

  1. 显式指定每列的排序规则,
  2. 成功执行,和
  3. 返回预期结果

以机智:

if object_id('tempdb..#tOwner') IS NOT NULL drop table #tOwner;
CREATE TABLE #tOwner(id int identity(1,1), email nvarchar(max) );
insert into #towner values ( cast('123@123.321'  as nvarchar(max)));
insert into #towner values ( cast('tsql rage'    as nvarchar(max)));
insert into #towner values ( cast('another@e.c'  as nvarchar(max)));
insert into #towner values ( cast('einstein.x.m' as nvarchar(max)));

;WITH data AS (
    SELECT DISTINCT convert(nvarchar(max), email) datapoint FROM #tOwner 
), CTE ( data_list, datapoint, length ) AS ( 
        SELECT convert(nvarchar(max),            ''           ) Collate SQL_Latin1_General_CP1_CI_AS,convert(nvarchar(max),    ''     ) Collate SQL_Latin1_General_CP1_CI_AS,       0
    UNION ALL
        SELECT convert(nvarchar(max),d.datapoint+';'+data_list) Collate SQL_Latin1_General_CP1_CI_AS,convert(nvarchar(max),d.datapoint) Collate SQL_Latin1_General_CP1_CI_AS, 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 ;

if object_id('tempdb..#tOwner') IS NOT NULL drop table #tOwner;
Run Code Online (Sandbox Code Playgroud)

预期在我的结果窗口中精美地坐着:

data_list
------------------------------------------------
tsql rage;einstein.x.m;another@e.c;123@123.321;
Run Code Online (Sandbox Code Playgroud)

  • 爱因斯坦很高兴这向您指示了正确的方向。 (2认同)
  • 作为记录,此问题至少应作为MS Connect问题发布。他们至少应该给您更好的错误信息。这对我来说真是不透明。我在SO上见过的最棘手的SQL Server问题! (2认同)
  • 谢谢你,谢谢你,谢谢你!:DI 有完全相同的错误,添加的数据类型也不匹配(我花了一段时间才发现我同时遇到了两个问题),但是如果没有整理帮助,我可能要花几天时间才能弄清楚是什么错了(大型复杂查询/数据库结构的一部分)。再次感谢你们(@WillA)!:) (2认同)