Подтвердить что ты не робот

Исключение MS SQL: неправильный синтаксис рядом с '@P0'

Я запрашиваю DB с использованием 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);
}

Спасибо заранее!

4b9b3361

Ответ 1

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

SELECT TOP (?)

Ответ 2

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

Ответ 3

Обновлен спящий режим до версии 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

Вопрос о спящем Джире: https://hibernate.atlassian.net/browse/HHH-10032

Ответ 4

Это также может быть вызвано синтаксической ошибкой в ​​вашем 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')