【问题标题】:COUNT field incorrect or syntax errorCOUNT 字段不正确或语法错误
【发布时间】:2016-03-09 11:03:59
【问题描述】:

当我收到以下错误消息时会出现什么错误

致命错误:未捕获的异常“PDOException”,带有消息“SQLSTATE[07002]:[Microsoft][ODBC Driver 11 for SQL Server]COUNT 字段不正确或语法错误”...

这是我正在使用的查询

$sql = $pdo->prepare("SELECT stockamount, stockname, stockbalance.stockid, SUM(ABS(reservationtransaction.stockquantity)) AS reservedamount FROM stockbalance
    JOIN stock ON stockbalance.stockid = stock.stockid
    LEFT JOIN reservationtransaction ON reservationtransaction.articleid = :artid
    WHERE stockbalance.articleid = :artid AND ((changeddate > DATEADD(yy,-1,GETDATE()) AND inventorydate > DATEADD(yy,-1,GETDATE())) OR stockbalance.stockamount <> 0)
    GROUP BY stockbalance.stockid");
$sql->bindValue(':artid', $productId);
$sql->execute();

我在 SO 中搜索过问题,但没有人相似或有帮助。
提前致谢。

编辑:此查询在使用 Microsoft SQL Server Management Studio 执行时工作正常,但在使用 PDO 时出现错误。

【问题讨论】:

  • 您的 stockamountstockname 不是 GROUP BY 的一部分,因此如果没有像 MIN 这样的聚合方法,您将无法选择它们。
  • 我猜你有 MySQL 背景:stackoverflow.com/questions/33629168/…。关键是 MySQL 聚合行为不是 ANSI 投诉。
  • 根据错误消息,这是一个 PDOException,而不是 SQL 异常。可能是结果集与您尝试将其绑定到的对象不匹配?
  • @TabAlleman,当我使用 Microsoft SQL Server Management Studio 执行此操作时,一切正常,但使用 PDO 时,我收到此错误。我也尝试不使用 bindValue() 并将值写入查询 - 同样的错误。

标签: sql-server pdo


【解决方案1】:

虽然 GROUP BY 通常是 COUNT 问题的罪魁祸首,但我在 SSRS 中遇到了主题错误,这是由于 SSRS 数据集查询和参数不匹配造成的。解决方案是确保查询中的每个 WHERE 都具有数据集的相应参数。 (我错过了一个。)

【讨论】:

    【解决方案2】:

    另一种可能性,如果您想避免多次提供数据(将@artid 的数据类型替换为正确的数据类型):

    $sql = $pdo->prepare("DECLARE @artid int = :artid
        SELECT stockamount, stockname, stockbalance.stockid, SUM(ABS(reservationtransaction.stockquantity)) AS reservedamount FROM stockbalance
        JOIN stock ON stockbalance.stockid = stock.stockid
        LEFT JOIN reservationtransaction ON reservationtransaction.articleid = @artid
        WHERE stockbalance.articleid = @artid AND ((changeddate > DATEADD(yy,-1,GETDATE()) AND inventorydate > DATEADD(yy,-1,GETDATE())) OR stockbalance.stockamount <> 0)
        GROUP BY stockbalance.stockid");
    $sql->bindValue(':artid', $productId);
    $sql->execute();
    

    这仅适用于支持 DECLARE 语句的 RDBMS。

    【讨论】:

      【解决方案3】:

      SQLBindParameter 中指定的参数数量小于 SQL 语句中包含的参数个数 *声明文本。调用 SQLBindParameter 时将 ParameterValuePtr 设置为空指针,StrLen_or_IndPtr 未设置为 SQL_NULL_DATA 或 SQL_DATA_AT_EXEC 和 InputOutputType 未设置为 SQL_PARAM_OUTPUT,所以 SQLBindParameter 中指定的参数数量为 大于包含的 SQL 语句中的参数个数 在 *StatementText 中。 SQLExecute Function

      占位符必须具有唯一的名称,即使它们具有相同的值

      $sql = $pdo->prepare("SELECT stockamount, stockname, stockbalance.stockid, SUM(ABS(reservationtransaction.stockquantity)) AS reservedamount FROM stockbalance
      JOIN stock ON stockbalance.stockid = stock.stockid
      LEFT JOIN reservationtransaction ON reservationtransaction.articleid = :artid
      WHERE stockbalance.articleid = :artid2 AND ((changeddate > DATEADD(yy,-1,GETDATE()) AND inventorydate > DATEADD(yy,-1,GETDATE())) OR stockbalance.stockamount <> 0)
      GROUP BY stockbalance.stockid");
      $sql->bindValue(':artid', $productId);
      $sql->bindValue(':artid2', $productId);
      $sql->execute();
      

      【讨论】:

      • 这就是问题所在!谢谢你的回答。
      • 你不知道这个答案为我节省了多少时间!非常感谢!!!
      • 为什么微软会让开发人员的生活更轻松,让他们在绑定参数*地狱中燃烧?!
      【解决方案4】:

      所有不在任何算术函数中的列都必须放在GROUP BY 子句中。见下文:

      SELECT stockamount, 
             stockname, 
             stockbalance.stockid, 
             Sum(Abs(reservationtransaction.stockquantity)) AS reservedamount 
      FROM   stockbalance 
             INNER JOIN stock 
                     ON stockbalance.stockid = stock.stockid 
             LEFT JOIN reservationtransaction 
                    ON reservationtransaction.articleid = :artid 
      WHERE  stockbalance.articleid = :artid 
             AND ( ( changeddate > Dateadd(yy, -1, Getdate()) 
                     AND inventorydate > Dateadd(yy, -1, Getdate()) ) 
                    OR stockbalance.stockamount <> 0 ) 
      GROUP  BY stockamount, 
                stockname, 
                stockbalance.stockid 
      

      【讨论】:

      • 好的,我试过了,但是没有用。我仍然收到错误SQLSTATE[07002]: [Microsoft][ODBC Driver 11 for SQL Server]COUNT field incorrect or syntax error
      猜你喜欢
      • 1970-01-01
      • 2022-01-09
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 2021-07-08
      相关资源
      最近更新 更多