Поле count или ошибка синтаксиса

какова будет ошибка, когда я получу следующее сообщение об ошибке

неустранимая ошибка: Необнаруженное исключение "PDOException" с сообщением "SQLSTATE[07002]: [Microsoft][драйвер ODBC 11 для 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();

Я искал вопросы в SO, но никто не был похож или полезен.
Спасибо заранее.

Edit: этот запрос работает нормально при выполнении его с Microsoft SQL Server Management Studio, но при использовании PDO я получаю ошибку.

3 ответов


количество параметров, указанных в SQLBindParameter, было меньше количество параметров в инструкции SQL, содержащихся в * StatementText. Sqlbindparameter вызывался с параметром ParameterValuePtr, равным нулевому указателю, StrLen_or_IndPtr не равным SQL_NULL_DATA или SQL_DATA_AT_EXEC и InputOutputType не установлены в SQL_PARAM_OUTPUT, поэтому что количество параметров, указанных в SQLBindParameter было больше, чем число параметров, содержащихся в инструкции SQL в * StatementText. Функция SQLExecute

заполнители должны иметь уникальные имена, даже если они имеют одинаковое значение

$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();

все столбцы, которые не находятся ни в одной арифметической функции, должны идти в 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 

другая возможность, если вы хотите избежать предоставления данных несколько раз (замените тип данных @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.