Исключение MS SQL: неправильный синтаксис рядом с '@ P0' - PullRequest
50 голосов
/ 12 августа 2011

Я запрашиваю БД, используя MS SQL, и по какой-то причине я получаю следующую ошибку: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '@P0', хотя этот 'P0' нигде в моем синтаксисе ...

Я читал, что у кого-то была такая же проблема, но он использовал сохраненный процесс, который я не использую, поэтому я не вижу, как его решение будет работать для меня. (Его решение заключается в добавлении фигурных скобок {} вокруг вызова процедуры.

В любом случае, ниже я вставил соответствующий код. Очень надеюсь, что кто-то может помочь мне с этим, расстроившись.

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);
}

Заранее спасибо!

Ответы [ 6 ]

88 голосов
/ 12 августа 2011

SQL Server требует, чтобы вы поместили круглые скобки вокруг аргумента в top, если передаете переменную:

SELECT TOP (?)
19 голосов
/ 02 сентября 2016

В нашем приложении мы расширили расстроенную SQLServerDialect. После изменения на SQLServer2008Dialect проблема исчезла.

12 голосов
/ 21 декабря 2016

Обновил hibernate до версии 5.x и наткнулся на эту проблему. Пришлось обновить конфигурацию "hibernate.dialect" из org.hibernate.dialect.SQLServerDialect до org.hibernate.dialect.SQLServer2012Dialect. Исправлена ​​проблема!

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

Спящий Jira выпуск: https://hibernate.atlassian.net/browse/HHH-10032

1 голос
/ 02 февраля 2015

Это также может быть вызвано синтаксической ошибкой в ​​вашем SQL, как это было для меня

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'

выдало сообщение

com.microsoft.sqlserver.jdbc.SQLServerException: неправильный синтаксис рядом с '@ P5'

проблема заключалась в том, что на самом деле проблема была в балансировке ')', а именно, правильная версия

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')
0 голосов
/ 27 мая 2018

Если вы используете Hibernate в приложении с весенней загрузкой, вы можете установить hibernate.dialect со следующим свойством конфигурации:

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

0 голосов
/ 21 марта 2018

Если вы используете пользовательский источник данных, добавление свойства:

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.SQLServer2012Dialect

в application.properties не будет работать.

Необходимо добавить свойство как карту свойств в вашем источнике данных.боб:

  @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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...