J'interroge une base de données à l'aide de MS SQL et, pour une raison quelconque, j'obtiens le message d'erreur suivant: com.Microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '@P0'
même si cette "P0" ne figure nulle part dans ma syntaxe ...
J'ai lu que quelqu'un avait le même problème mais utilisait un proc stocké, quelque chose que je n'utilise pas, donc je ne vois pas comment sa solution fonctionnerait pour moi. (Sa solution étant quelque chose d’ajouter des accolades {} autour de l’appel de procédure.
Quoi qu'il en soit, j'ai collé le code correspondant ci-dessous. J'espère vraiment que quelqu'un pourra m'aider avec cela, devenant 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!
SQL Server nécessite que vous plaçiez des parenthèses autour de l'argument à top
si vous transmettez une variable:
SELECT TOP (?)
Dans notre application, nous avons étendu une SQLServerDialect
dépréciée. Après le changement en SQLServer2008Dialect
, le problème a disparu.
Hibernate mis à niveau vers la version 5.x et est tombé sur ce problème. Devait mettre à jour la configuration "hibernate.dialect" d'org.hibernate.dialect.SQLServerDialect à org.hibernate.dialect.SQLServer2012Dialect. Correction du problème!
Référence Hibernate Doc: https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/session-configuration.html#configuration-programmatic
Numéro Hibernate Jira: https://hibernate.atlassian.net/browse/HHH-10032
Cela peut aussi être causé par 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 l'équilibrage ')' 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')
Si vous utilisez Hibernate dans une application Spring-Boot, vous pouvez définir hibernate.dialect
avec la propriété de configuration suivante:
spring.jpa.database-platform=org.hibernate.dialect.SQLServer2008Dialect
Si vous utilisez une source de données personnalisée, ajoutez la propriété suivante:
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.SQLServer2012Dialect
dans application.properties ne fonctionnera pas.
Vous devez ajouter la propriété sous la forme d'une carte de propriétés dans votre bean de source de données:
@Bean
public LocalContainerEntityManagerFactoryBean sqlServerEntityManagerFactory() {
HashMap<String, String> properties = new HashMap<>();
properties.put("hibernate.dialect", "org.hibernate.dialect.SQLServer2012Dialect");
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(sqlServerDataSource());
factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
factoryBean.setJpaPropertyMap(properties);
return factoryBean;
}