CTE触发锚点和递归零件的浇铸错误

时间:2019-05-09 13:21:18

标签: sql tsql common-table-expression

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

/Hazelcast-jet-3.0/lib

但是我收到如下铸造错误。

  

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

由于标题字段只是varchar类型,所以我不明白这个问题。那么为什么类型不匹配?

2 个答案:

答案 0 :(得分:2)

union all的第一部分中,我认为您在创建'' as ParentTitle时要明确一些,以便它实际上是列的类型。例如convert(varchar(30), null) as ParentTitle

答案 1 :(得分:2)

我本人承认,我搜索了您的错误消息,并发现this SO question讨论了类似的问题。

这里的窍门是,即使您的两列都是文本,它们也不是同一类型的文本(例如,宽度等)。

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

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 ...
)

侧面说明:您只需要在联合查询的第一个选择中使用别名。实际上,联合的后续部分中的别名将被忽略。