Sql CTE触发锚定和递归零件的铸造错误

Sql CTE触发锚定和递归零件的铸造错误,sql,tsql,common-table-expression,Sql,Tsql,Common Table Expression,我有一个CTE,如下所示,它实际上是从VSTS数据中查找所有工作项及其父项 ;with cte(wtype,id,parent,title,ptype,WILevel,ParentTitle) as ( select WorkItemType,wi_id,parent,title,ParentType,0 as WILevel,'' as ParentTitle from tbl_VSTS_AllWorkItems where Parent is null and state<>'R

我有一个CTE,如下所示,它实际上是从VSTS数据中查找所有工作项及其父项

;with cte(wtype,id,parent,title,ptype,WILevel,ParentTitle) as
(
select WorkItemType,wi_id,parent,title,ParentType,0 as WILevel,'' as ParentTitle from tbl_VSTS_AllWorkItems where Parent is null and state<>'Removed'
union all
select WorkItemType,wi_id,W.parent,W.title,ParentType=t2.wtype,(t2.WILevel+1) as WILevel, t2.title as ParentTitle  from tbl_VSTS_AllWorkItems W inner join cte t2 on t2.id=W.Parent where state<>'Removed'
)

select * from cte where WILevel=0;
但我得到的铸造错误如下

Msg 240,16级,状态1,第8行 递归查询cte的ParentTitle列中的锚点和递归部分之间的类型不匹配


我不理解这个问题,因为title字段只是varchar类型。那么为什么类型不匹配呢?

在union all的第一部分中,我认为您希望在创建as ParentTitle时显式显示,以便它实际上是列的类型。例如convertvarchar30,null作为ParentTitle。

在union all的第一部分中,我认为您希望在创建为ParentTitle时显式显示,以便它实际上是列的类型。例如convertvarchar30,ParentTitle为null。

我自己承认,我搜索了您的错误消息,发现了讨论类似问题的错误消息

这里的技巧是,即使两列都是文本,它们也不是相同类型的文本,例如宽度等

假设tbl_VSTS_AllWorkItems.title列是varchar50,您可以通过将空字符串也强制转换为varchar50来解决此错误,例如


旁注:您只需要在联合查询的第一个select中使用别名。事实上,工会后续部分的别名将被忽略。

我自己承认,我搜索了您的错误消息,发现其中讨论了类似的问题

这里的技巧是,即使两列都是文本,它们也不是相同类型的文本,例如宽度等

假设tbl_VSTS_AllWorkItems.title列是varchar50,您可以通过将空字符串也强制转换为varchar50来解决此错误,例如


旁注:您只需要在联合查询的第一个select中使用别名。实际上,联合体后续部分的别名将被忽略。

列tbl_VSTS_AllWorkItems.title的类型是什么?列tbl_VSTS_AllWorkItems.title的类型是什么?列tbl_VSTS_AllWorkItems.title的类型是什么?列的可能重复。因为列名称在CTE声明的第一行中提供,在锚定部分中,别名实际上也是不必要的;完美的这就是原因。。我像这样铸造了标题栏,效果很好。。由于第一行CTE声明中提供了列名,因此在锚定部分中实际上也不需要别名;完美的这就是原因。。我像这样铸造了标题栏,效果很好。。作为ParentTitle转换为演员varchar100作为ParentTitle
WITH cte (wtype,id,parent,title,ptype,WILevel,ParentTitle) AS (
    SELECT ..., CAST('' AS varchar(50)) AS ParentTitle
    FROM tbl_VSTS_AllWorkItems
    WHERE ...
    UNION ALL
    SELECT ..., t2.title
    FROM tbl_VSTS_AllWorkItems
    WHERE ...
)