Поле 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.