59 votes

Exception MS SQL : Syntaxe incorrecte près de '@P0'.

J'interroge une base de données à l'aide de MS SQL et, pour une raison quelconque, j'obtiens l'erreur suivante : com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '@P0' même si ce 'P0' n'est nulle part dans ma syntaxe...

J'ai lu que quelqu'un avait eu le même problème mais qu'il utilisait une procédure stockée, ce que je n'utilise pas, donc je ne vois pas comment sa solution pourrait me convenir. (Sa solution consiste à ajouter des accolades {} autour de l'appel de la procédure.

Quoi qu'il en soit, j'ai collé ci-dessous le code correspondant. J'espère vraiment que quelqu'un pourra m'aider sur ce point, je suis assez frustré.

PreparedStatement stmt = null;
Connection conn = null;    

String sqlQuery = "SELECT TOP ? \n"+
                              "z.bankAccountNo, \n"+
                              "z.statementNo, \n"+
                              "z.transactionDate, \n"+
                              "z.description, \n"+
                              "z.amount, \n"+
                              "z.guid \n"+
                              "FROM \n"+
                              "( \n"+
                              "select  \n"+
                              "ROW_NUMBER() OVER (ORDER BY x.transactionDate, x.statementNo) AS RowNumber, \n"+
                              "x.transactionDate, \n"+
                              "x.statementNo, \n"+
                              "x.description, \n"+
                              "x.amount, \n"+
                              "x.bankAccountNo, \n"+
                              "x.guid \n"+
                              "FROM \n"+
                              "( \n"+
                              "SELECT  \n"+
                              "a.bankAccountNo,  \n"+
                              "a.statementNo,  \n"+
                              "a.transactionDate, \n"+
                              "a.description,  \n"+
                              "a.amount,  \n"+
                              "a.guid  \n"+
                              "FROM BankTransactions as a  \n"+
                              "LEFT OUTER JOIN BankTransactionCategories as b  \n"+
                              "ON a.category = b.categoryCode  \n"+
                              "WHERE b.categoryCode is null \n"+
                              ") as x \n"+
                              ") as z \n"+
                              "WHERE (z.RowNumber >= ?)";

stmt = conn.prepareStatement(sqlQuery);
stmt.setInt(1, RowCountToDisplay);
stmt.setInt(2, StartIndex);
ResultSet rs = null;
try{
    rs = stmt.executeQuery();
} catch (Exception Error){
    System.out.println("Error: "+Error);
}

Merci d'avance !

110voto

Andomar Points 115404

Le serveur SQL exige que vous placiez des parenthèses autour de l'argument pour top si vous passez dans une variable :

SELECT TOP (?)

22voto

Tomasz Godziński Points 396

Dans notre application, nous avons prolongé un système de déprogrammation. SQLServerDialect . Après le passage à SQLServer2008Dialect le problème a disparu.

12voto

MarCrazyness Points 2072

J'ai mis à jour hibernate à la version 5.x et j'ai rencontré ce problème. J'ai dû mettre à jour la configuration "hibernate.dialect" de org.hibernate.dialect.SQLServerDialect à org.hibernate.dialect.SQLServer2012Dialect. Le problème est résolu !

Hibernate Doc Reference : https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/session-configuration.html#configuration-programmatic

Hibernate Jira issue : https://hibernate.atlassian.net/browse/HHH-10032

1voto

Nick Points 46

Cela peut également être dû à une erreur de syntaxe dans votre SQL, comme ce fut le cas pour moi.

select * from drivel d where exists (select * from drivel where d.id = drivel.id and drivel.start_date < '2015-02-05' AND '2015-02-05' < drivel.end_date) OR exists (select * from drivel where d.id = drivel.id and drivel.start_date < '2015-02-05' AND '2015-02-05' < drivel.end_date) OR exists (select * from drivel where d.id = drivel.id and '2015-02-05' < drivel.start_date and drivel.end_date < '2015-02-05'

a donné le message

com.microsoft.sqlserver.jdbc.SQLServerException : Syntaxe incorrecte près de '@P5'.

le problème était en fait le balancement ')' manquant à la fin, à savoir, la version correcte est

select * from drivel d where exists (select * from drivel where d.id = drivel.id and drivel.start_date < '2015-02-05' AND '2015-02-05' < drivel.end_date) OR exists (select * from drivel where d.id = drivel.id and drivel.start_date < '2015-02-05' AND '2015-02-05' < drivel.end_date) OR exists (select * from drivel where d.id = drivel.id and '2015-02-05' < drivel.start_date and drivel.end_date < '2015-02-05')

1voto

Meysam Points 527

Si vous utilisez Hibernate au sein d'une application spring-boot, vous pouvez configurer hibernate.dialect avec la propriété de configuration suivante :

spring.jpa.database-platform=org.hibernate.dialect.SQLServer2008Dialect

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X