Ответ 1
SQL Server требует, чтобы вы помещали скобки вокруг аргумента в top
, если вы передаете переменную:
SELECT TOP (?)
Я запрашиваю 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);
}
Спасибо заранее!
SQL Server требует, чтобы вы помещали скобки вокруг аргумента в top
, если вы передаете переменную:
SELECT TOP (?)
В нашем приложении мы расширили разрозненный SQLServerDialect
. После изменения на SQLServer2008Dialect
проблема исчезла.
Обновлен спящий режим до версии 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
Это также может быть вызвано синтаксической ошибкой в вашем 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')