2009-07-06 4 views
0

Je rencontre un problème lors de l'interrogation de Sybase IQ avec une instruction préparée. La requête fonctionne correctement lorsque je tape la requête entière en tant que texte, puis appelez PrepareStatement dessus sans paramètres. Mais quand je m'en tiens à un paramètre, je récupère des erreurs, même si mon sql est correct. Une idée pourquoi?Une instruction préparée avec "partition by" ne fonctionne pas avec Sybase IQ?

Ce code fonctionne parfaitement bien et exécute ma requête:

errorquery<<"SELECT 1 as foobar \ 
     ,  (SUM(1) over (partition by foobar))  as myColumn \ 
     FROM spgxCube.LPCache lpcache \ 
       WHERE lpcache.CIG_OrigYear = 2001 "; 


odbc::Connection* connQuery= SpgxDBConnectionPool::getInstance().getConnection("MyServer"); 
PreparedStatementPtr pPrepStatement(connQuery->prepareStatement(errorquery.str())); 
    pPrepStatement->executeQuery(); 

Mais c'est exactement la même chose, sauf au lieu de taper « 2001 » directement dans le code, je l'insère avec un paramètre:

errorquery<<"SELECT 1 as foobar \ 
     ,  (SUM(1) over (partition by foobar))  as myColumn \ 
     FROM spgxCube.LPCache lpcache \ 
       WHERE lpcache.CIG_OrigYear = ? "; 

    odbc::Connection* connQuery = SpgxDBConnectionPool::getInstance().getConnection("MyServer"); 
    PreparedStatementPtr pPrepStatement(connQuery->prepareStatement(errorquery.str())); 

    int intVal = 2001; 
    pPrepStatement->setInt(1, intVal); 

    pPrepStatement->executeQuery(); 

qui donne cette erreur: [Sybase] [ODBC Driver] [Adaptive Server Anywhere] expression non valide à proximité '(SUM (1) sur (partition par foobar)) comme mycolumn'

Une idée de pourquoi le premier fonctionne si le second échoue? N'avez-vous pas le droit d'utiliser "partition by" avec les paramètres sql insérés ou quelque chose comme ça?

Répondre

0

Je ne connais pas grand chose à Adaptive Server Anywhere, mais vous utilisez le pilote Adaptive Server Anywhere pour interroger Sybase IQ.

Est-ce vraiment ce que vous voulez?

1

L'erreur Sybase (ASA) Adaptive Server Anywhere est correcte, il existe une instance Sybase ASA incluse dans la base de données IQ, utilisée pour l'espace système.

Je ne sais pas si la partition par est prise en charge/entièrement prise en charge dans les versions antérieures à Sybase IQ v12.7. Je me souviens d'avoir des problèmes avec la version 12.6. En vertu de v12.7 ou mieux, ça devrait aller et sinon votre commande me semble bonne.

Questions connexes