Sql server 计数字段不正确或语法错误

Sql server 计数字段不正确或语法错误,sql-server,pdo,Sql Server,Pdo,当我收到以下错误消息时,会出现什么错误 致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[07002]:[Microsoft][ODBC驱动程序11 for SQL Server]计数字段不正确或语法错误” 这就是我正在使用的查询 $sql = $pdo->prepare("SELECT stockamount, stockname, stockbalance.stockid, SUM(ABS(reservationtransaction.stockquantit

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

致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[07002]:[Microsoft][ODBC驱动程序11 for SQL Server]计数字段不正确或语法错误”

这就是我正在使用的查询

$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();
$sql=$pdo->prepare(“选择stockamount、stockname、stockbalance.stockid、SUM(ABS(reservationtransaction.stockquantity))作为来自stockbalance的reservedamount
在stockbalance.stockid=stock.stockid上加入库存
reservationtransaction.articleid=:artid上的左加入reservationtransaction
其中stockbalance.articleid=:artid和((changeddate>DATEADD(yy,-1,GETDATE())和inventorydate>DATEADD(yy,-1,GETDATE())或stockbalance.stockamount 0)
按stockbalance.stockid分组);
$sql->bindValue(':artid',$productId);
$sql->execute();
我在SO中搜索了一些问题,但没有人是类似的或有帮助的。
提前谢谢


编辑:当使用Microsoft SQL Server Management Studio执行此查询时,它工作正常,但当使用PDO时,我得到了错误。

所有不在任何算术函数中的列都必须位于
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 
选择库存金额,
股票名称,
stockbalance.stockid,
总计(Abs(reservationtransaction.stockquantity))作为reservedamount
从库存平衡
内连接料
在stockbalance.stockid=stock.stockid上
左连接保留事务
关于reservationtransaction.articleid=:artid
其中stockbalance.articleid=:artid
和((changeddate>Dateadd(yy,-1,Getdate())
和inventorydate>Dateadd(yy,-1,Getdate())
或库存余额。库存金额0)
按库存量分组,
股票名称,
stockbalance.stockid
SQLBindParameter中指定的参数数小于 中包含的SQL语句中的参数数 *语句文本。调用SQLBindParameter时,ParameterValuePtr设置为空指针,StrLen_或_IndPtr未设置为SQL_null_数据或 SQL_数据_在_EXEC,而InputOutputType未设置为SQL_参数_输出,因此 SQLBindParameter中指定的参数数为 大于包含的SQL语句中的参数数 在*语句文本中

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

$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();
$sql=$pdo->prepare(“选择stockamount、stockname、stockbalance.stockid、SUM(ABS(reservationtransaction.stockquantity))作为来自stockbalance的reservedamount
在stockbalance.stockid=stock.stockid上加入库存
reservationtransaction.articleid=:artid上的左加入reservationtransaction
其中stockbalance.articleid=:artid2和((changeddate>DATEADD(yy,-1,GETDATE())和inventorydate>DATEADD(yy,-1,GETDATE())或stockbalance.stockamount 0)
按stockbalance.stockid分组);
$sql->bindValue(':artid',$productId);
$sql->bindValue(':artid2',$productId);
$sql->execute();

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

$sql=$pdo->prepare(“DECLARE@artid int=:artid
选择stockamount、stockname、stockbalance.stockid、SUM(ABS(reservationtransaction.stockquantity))作为stockbalance中的reservedamount
在stockbalance.stockid=stock.stockid上加入库存
在reservationtransaction.articleid=@artid上左加入reservationtransaction
其中stockbalance.articleid=@artid和((changeddate>DATEADD(yy,-1,GETDATE())和inventorydate>DATEADD(yy,-1,GETDATE())或stockbalance.stockamount 0)
按stockbalance.stockid分组);
$sql->bindValue(':artid',$productId);
$sql->execute();

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

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

你的
stockamount
stockname
不属于
分组依据
的一部分,因此如果没有像
MIN
这样的聚合方法,你就无法选择它们。我猜你有MySQL背景:。关键是MySQL聚合行为不是ANSI投诉。根据错误消息,这是一个PDO异常,而不是SQL异常。可能是结果集不匹配,以及您试图将其绑定到的对象不匹配吗?@TabAlleman,当我使用Microsoft SQL Server Management Studio执行此操作时,一切正常,但当使用PDO时,我遇到此错误。我还尝试了在没有
bindValue()
的情况下将值写入查询-同样的错误。我仍然收到错误
SQLSTATE[07002]:[Microsoft][ODBC Driver 11 for SQL Server]计数字段不正确或语法错误。这就是问题所在!谢谢你的回答。你不知道这个回答为我节省了多少时间!非常感谢!!!为什么微软会让开发人员的生活更轻松,让他们在绑定参数中燃烧*见鬼?!
$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();