web-dev-qa-db-fra.com

Champ COUNT incorrect ou erreur de syntaxe

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.

12
lingo

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();
19
Taalaibek Ashirov

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 
1
M.Ali

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.

0
Aaron Mason