2015-12-04 13 views
8

Quale sarebbe l'errore quando mi seguente messaggio di errorecampo COUNT errore non corretto o la sintassi

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[07002]: [Microsoft][ODBC Driver 11 for SQL Server]COUNT field incorrect or syntax error'...

Questa è la query che sto utilizzando

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

Ho cercato domande in SO, ma nessuno era simile o utile.
Grazie in anticipo.

Modifica: Questa query funziona correttamente quando viene eseguita con Microsoft SQL Server Management Studio, ma quando si utilizza PDO, viene visualizzato l'errore.

+0

tuo '' stockamount' e stockname' non fanno parte del 'GROUP BY' in modo da non è possibile selezionarli senza un metodo di aggregazione come 'MIN'. –

+1

Immagino di avere uno sfondo MySQL: http: //stackoverflow.com/questions/33629168/group-by-clause-in-mysql-and-postgresql-why-the-error-in-postgresql/33629201#33629201. Il punto è che il comportamento di aggregazione di MySQL non è un reclamo ANSI. – lad2025

+0

Per il messaggio di errore, questo è un PDOException, non un'eccezione SQL. Potrebbe essere una mancata corrispondenza nel set di risultati e l'oggetto a cui stai cercando di collegarlo? –

risposta

15

The number of parameters specified in SQLBindParameter was less than the number of parameters in the SQL statement contained in *StatementText. SQLBindParameter was called with ParameterValuePtr set to a null pointer, StrLen_or_IndPtr not set to SQL_NULL_DATA or SQL_DATA_AT_EXEC, and InputOutputType not set to SQL_PARAM_OUTPUT, so that the number of parameters specified in SQLBindParameter was greater than the number of parameters in the SQL statement contained in *StatementText. SQLExecute Function

segnaposto devono avere nomi univoci, anche se hanno lo stesso valore

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

Questo era il problema! Grazie per la tua risposta. – lingo

1

Tutte le colonne che non hanno alcuna funzione aritmetica devono essere inserite nella clausola GROUP BY. vedi sotto:

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

Ok, ci ho provato, ma non aiuta. Sto ancora ricevendo l'errore 'SQLSTATE [07002]: [Microsoft] [Driver ODBC 11 per SQL Server] COUNT campo errato o errore di sintassi'. – lingo