Quelle serait l'erreur quand j'obtiens le message d'erreur suivant
Erreur fatale: exception non capturée 'PDOException' avec le message 'SQLSTATE [07002]: [Microsoft] [Pilote ODBC 11 pour SQL Server] Champ COUNT incorrect ou erreur de syntaxe' ...
C'est la requête que j'utilise
$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();
J'ai cherché des questions dans SO, mais personne n'a été semblable ou utile.
Merci d'avance.
Edition: Cette requête fonctionne correctement lors de son exécution avec Microsoft SQL Server Management Studio, mais lorsque j'utilise PDO, le message d'erreur s'affiche.
Le nombre de paramètres spécifiés dans SQLBindParameter était inférieur à le nombre de paramètres dans l'instruction SQL contenue dans * StatementText. SQLBindParameter a été appelé avec ParameterValuePtr défini sur un pointeur null, StrLen_or_IndPtr non défini sur SQL_NULL_DATA ou SQL_DATA_AT_EXEC et InputOutputType non défini sur SQL_PARAM_OUTPUT, donc que le nombre de paramètres spécifiés dans SQLBindParameter était supérieur au nombre de paramètres dans l'instruction SQL contenue dans * StatementText. Fonction SQLExecute
les espaces réservés doivent avoir des noms uniques même s'ils ont la même valeur
$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();
Toutes les colonnes qui ne sont dans aucune fonction arithmétique doivent aller dans la clause GROUP BY
. voir ci-dessous:
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
Une autre possibilité, si vous souhaitez éviter de fournir plusieurs fois des données (remplacez le type de données de @artid par le type de données correct):
$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();
Cela ne fonctionnera que dans un SGBDR prenant en charge les instructions DECLARE.