首页 > 解决方案 > 按年、月、日排序结果时参数太少错误

问题描述

我正在尝试按年、月、日对结果进行分组以进行输出。

2019
  February
      Day

我不确定我在这里做错了什么,并想知道这是否是 MS Access 问题。以下代码产生参数太少错误。

<cfquery name="nchklist" datasource="#fds#">
    SELECT year(chkdate) AS Year, month(chkdate) AS month, day(chkdate) AS day, vcheck
    FROM vchk
    where vid = '#vid#' and final = 1
    ORDER BY year, month, day
</cfquery>

<cfoutput query="nchklist" group="year">

    <cfoutput group="month">
        #monthAsString(month)#

        <cfoutput group="day">
            <a href="create_report.cfm?vcheck=#vcheck#">View</a> :  DateFormat(chkdate, 'dddd - mmmm d, yyyy')#<br>
        </cfoutput>

    </cfoutput>

</cfoutput>

标签: sortingms-accesscoldfusion

解决方案


更新:

我使用 Access 已经有好几年了,所以我的知识有点模糊,但我开始记得它对 ORDER BY 子句有限制。与真正的 DBMS 不同,它不够聪明,无法按列别名进行排序。我不知道这在最近的版本中是否发生了变化,但是......就像我之前提到的,你应该尝试按原始表达式排序 - 而不是别名:

ORDER BY year(chkdate), month(chkdate), day(chkdate)

顺便说一句,CF 并不是一个出色的 sql 调试工具。它与数据库间接通信,通常通过 JDBC 驱动程序。与使用标准数据库工具相比,该过程返回的一般错误消息通常要多得多。每当您遇到这样的神秘错误时,最好直接在数据库中运行 sql 查询,根据需要硬编码参数。这样做可能会给您一个不那么神秘的错误消息,或者至少表明 ORDER BY 子句是问题所在。


评论中所述,该错误可能表示列名拼写错误。当保留字用作列名或别名时,也会发生这种情况。请注意,您的查询使用了名为Year,MonthDay? 这些是Access 中的保留字。这可能是错误的原因。尝试将您的列别名更改为非保留字,例如TheYear, TheMonth, TheDay

假设 MS Access 支持按列别名排序,请尝试以下查询:

 SELECT year(chkdate) AS TheYear
        , month(chkdate) AS TheMonth
        , day(chkdate) AS TheDay
        , vcheck
 FROM   vchk
 WHERE  vid = <cfqueryparam value="#vid#" cfsqltype="cf_sql_varchar"> 
 AND    final = 1
 ORDER BY TheYear, TheMonth, TheDay

注意:即使使用 MS Access,查询也应始终对所有输入参数使用 cfqueryparam。


推荐阅读