2011-08-12 76 views
39

Estoy consultando un DB usando MS SQL y por alguna razón me sale el siguiente error: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '@P0' aunque este 'P0' no está en ningún lugar de mi sintaxis ...Excepción de MS SQL: sintaxis incorrecta cerca de '@ P0'

He leído que alguien ha tenido el mismo problema pero que estaban usando un proceso almacenado, algo que no estoy usando, así que no veo cómo su solución funcionará para mí. (Su solución es asomething sobre la adición de llaves {} alrededor de la llamada a procedimiento.

De todas formas, a continuación He pegado el código en cuestión. Realmente espero que alguien me puede ayudar con esto, haciendo totalmente frustrado.

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

Gracias ! de antemano

+0

'@ P0' es el parámetro rowcounttodisplay –

+0

¿Puede proporcionar SQL real que causa el error? Parece que no proporciona correctamente 'RowCountToDisplay' – VMAtm

Respuesta

70

SQL Server requiere que se coloque paréntesis alrededor del argumento para top si se pasa en una variable:

SELECT TOP (?) 
+0

¡Gracias! este era el problema ... He estado luchando con esto durante horas. Siempre hay algo pequeño, ¿no? Gracias de nuevo. – Tiwaz89

+1

Este error también puede aparecer con las consultas 'INSERT' sobre el enlace de error de sintaxis. El número después de los caracteres '@ P' puede indicar qué parámetro produce el error (' @ P3' para el tercer parámetro, ...). – Fractaliste

+1

Probable tiempo dedicado a este problema sin SO: 3-8 horas Tiempo dedicado a este problema con SO: 55 segundos. ¡Gracias! – KjetilNordin

1

Es ca n también ser causada por un error de sintaxis en su SQL como era el caso para mí

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' 

dio el mensaje

com.microsoft.sqlserver.jdbc.SQLServerException: Sintaxis incorrecta cerca de '@ P5'

el problema era en realidad el equilibrio ')' faltante al final, es decir, la versión correcta es

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') 
14

en nuestra aplicación han extendido un depilado SQLServerDialect. Después de cambiar a SQLServer2008Dialect, el problema desapareció.

+1

experimenté lo mismo después de moverme a Spring Boot 1.4, por lo tanto, obtuve la nueva versión de Hibernate –

+1

esto cuando se usa 'PageRequest'. Supongo, según la respuesta de @Andomar, que se implementa utilizando un "top" sin paréntesis. Como dices, actualizar desde 'SQLServerDialect' (en mi caso hasta 2012) parece solucionar el problema.Aparentemente, esto fue un cambio en SQL Server 2005: http://www.dotnetfunda.com/articles/show/59/difference-between-top-clause-in-sql-2000-and-sql-2005 – Steve

10

Hibernación mejorada a la versión 5.x y se encontró con este problema. Tuve que actualizar la configuración de "hibernate.dialect" de org.hibernate.dialect.SQLServerDialect a org.hibernate.dialect.SQLServer2012Dialect. ¡Solucionado el problema!

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

Hibernate Jira: https://hibernate.atlassian.net/browse/HHH-10032

Cuestiones relacionadas