web-dev-qa-db-fra.com

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 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!

48
Tiwaz89

SQL Server nécessite que vous plaçiez des parenthèses autour de l'argument à top si vous transmettez une variable:

SELECT TOP (?)
82
Andomar

Dans notre application, nous avons étendu une SQLServerDialect dépréciée. Après le changement en SQLServer2008Dialect, le problème a disparu.

19
Tomasz Godziński

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

12
MarCrazyness

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')
1
Nick

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

0
Meysam

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;
}
0
Prashant