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

时间:2018-11-29 08:40:40

标签: sql sql-server common-table-expression

执行以下查询:

WITH cte AS (
    SELECT CAST('" + mindate+ "' as varchar(255))  as fdate
    UNION ALL
    SELECT CAST(DATEADD(day, 1, fdate) as date)
    FROM cte
    WHERE fdate < '" + tday+"'
)
SELECT COUNT(fdate) AS Fdate
FROM cte left join tbl_Attendence on cte.fdate = tbl_Attendence.Datess
where tbl_Attendence.Datess is null

但是我结束了以下错误:

  

列中的锚点和递归部分之间的类型不匹配   递归查询“ cte”的“ fdate”。

3 个答案:

答案 0 :(得分:1)

这是您的原始查询:

        @media (max-width: 575px) {
        .pieChart {
            padding: 0px 60px 20px 60px;
        }
        .barChart {
            margin: 0px;
            padding: 0px 40px 20px 40px;
        }
    }

    @media (min-width: 576px) and (max-width: 767px) {
        .pieChart {
            padding: 0px 20px 0px 20px;
        }
        .barChart {
            margin: 0px;
            padding: 0px 10px 0px 10px;
        }
    }

    @media (min-width: 768px) and (max-width: 860px) {
        .pieChart {
            padding: 0px 60px 0px 60px;
        }

        .barChart {
            margin: 0px;
            padding: 0px 20px 0px 20px;
        }
    }

    @media (min-width: 861px) and (max-width: 991px) {
        .pieChart {
            padding: 0px 85px 0px 85px;
        }

        .barChart {
            margin: 0px;
            padding: 0px 20px 0px 20px;
        }
    }

    @media (min-width: 992px) and (max-width: 1100px) {
        .pieChart {
            padding: 0px 110px 0px 110px;
        }
        .barChart {
            margin: 0px;
            padding: 0px 60px 0px 60px;
        }
    }

    @media (min-width: 1101px) and (max-width: 1199px) {
        .pieChart {
            padding: 0px 130px 0px 130px;
        }
        .barChart {
            margin: 0px;
            padding: 0px 60px 0px 60px;
        }
    }

问题在于CTE内部的第一个WITH cte AS ( SELECT CAST('" + mindate+ "' as varchar(255)) as fdate UNION ALL SELECT CAST(DATEADD(day, 1, fdate) as date) FROM cte WHERE fdate < '" + tday+"' ) SELECT COUNT(fdate) AS Fdate FROM cte left join tbl_Attendence on cte.fdate = tbl_Attendence.Datess where tbl_Attendence.Datess is null SELECT类型,而联合副本(CTE内部的第二个VARCHAR(255))是SELECT类型。由于您将这些结果加在一起,因此数据类型必须匹配。

有一个DATEWHERE)正在比较字符串值。在我看来,您希望将其作为动态SQL。如果不先构建字符串,它将无法在普通SQL上运行。

由于我不知道您要完成什么,所以我无法提出解决方案。


如果Damien的建议是正确的,则可以使用以下内容找出fdate < '" + tday+"'中缺少的日期:

tbl_Attendence

答案 1 :(得分:0)

从官方docs起,您具有:

  

递归成员中列的数据类型必须与   锚成员中相应列的数据类型。

检查所有规则,并确保遵循它们。

答案 2 :(得分:0)

在并集中,所有记录必须具有相同的列和相同的列名称,您使用了fdate和date,您应该对列使用相同的名称

WITH cte AS (
    SELECT CAST('" + mindate+ "' as varchar(255))  as fdate
    UNION ALL
    SELECT CAST(DATEADD(day, 1, fdate) as fdate)
    FROM cte
    WHERE fdate < '" + tday+"'
)
SELECT COUNT(fdate) AS Fdate
FROM cte left join tbl_Attendence on cte.fdate = tbl_Attendence.Datess
where tbl_Attendence.Datess is null