2011-08-12 37 views
39

Tôi đang truy vấn DB bằng MS SQL và vì lý do nào đó tôi nhận được lỗi sau: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '@P0' mặc dù 'P0' này không có ở đâu trong cú pháp của tôi ...Ngoại lệ MS SQL: Cú pháp không chính xác gần '@ P0'

Tôi đã đọc rằng ai đó đã gặp vấn đề tương tự nhưng họ đang sử dụng một proc được lưu trữ, thứ mà tôi không sử dụng nên tôi không thấy giải pháp của anh ấy sẽ hoạt động như thế nào đối với tôi. (Giải pháp của ông là asomething về việc thêm dấu ngoặc {} xung quanh cuộc gọi thủ tục.

Anyways, dưới đây tôi đã dán mã có liên quan. Thực sự hy vọng ai đó có thể giúp tôi với điều này, nhận được khá thất vọng.

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

Cảm ơn ! trước

+0

'@ P0' là tham số rowcounttodisplay bạn –

+0

bạn có thể cung cấp sql thực tế gây ra lỗi? Có vẻ như bạn không cung cấp đúng cách 'RowCountToDisplay' – VMAtm

Trả lời

70

SQL server đòi hỏi bạn phải đặt dấu ngoặc xung quanh tranh cãi để top nếu bạn vượt qua trong một biến:

SELECT TOP (?) 
+0

Cảm ơn bạn! đây là vấn đề ... Đã đấu tranh với điều này trong nhiều giờ. Luôn luôn là một điều nhỏ phải không ... Cảm ơn một lần nữa. – Tiwaz89

+1

Lỗi này cũng có thể xuất hiện với các truy vấn 'INSERT' về ràng buộc lỗi cú pháp. Số sau ký tự '@ P' có thể cho biết tham số nào tạo ra lỗi (' @ P3' cho tham số thứ ba, ...). – Fractaliste

+1

Có thể tốn thời gian cho vấn đề này mà không có SO: 3-8 giờ Thời gian dành cho vấn đề này với SO: 55 giây. Cảm ơn bạn! – KjetilNordin

1

Nó ca n cũng được gây ra bởi một lỗi cú pháp trong SQL của bạn như là trường hợp đối với tôi

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' 

cho thông điệp

com.microsoft.sqlserver.jdbc.SQLServerException: cú pháp sai gần '@ P5'

vấn đề thực sự là cân bằng ')' mất tích ở cuối, cụ thể là, phiên bản đúng là

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

Trong ứng dụng của chúng tôi chúng tôi đã mở rộng SQLServerDialect. Sau khi thay đổi thành SQLServer2008Dialect sự cố đã biến mất.

+1

Tôi đã trải nghiệm tương tự sau khi chuyển sang Spring Boot 1.4 do đó phiên bản Hibernate mới –

+1

điều này khi sử dụng 'PageRequest'. Tôi đoán, theo câu trả lời từ @Andomar, rằng nó được thực hiện bằng cách sử dụng một "đầu" mà không có dấu ngoặc đơn. Như bạn nói, cập nhật từ 'SQLServerDialect' (trong trường hợp của tôi đến năm 2012) dường như để khắc phục vấn đề.Rõ ràng, đây là một sự thay đổi trong SQL Server 2005: http://www.dotnetfunda.com/articles/show/59/difference-between-top-clause-in-sql-2000-and-sql-2005 – Steve

10

Đã nâng cấp ngủ đông lên phiên bản 5.x và gặp phải sự cố này. Đã phải cập nhật cấu hình "hibernate.dialect" từ org.hibernate.dialect.SQLServerDialect thành org.hibernate.dialect.SQLServer2012Dialect. Đã khắc phục sự cố!

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

Hibernate Jira vấn đề: https://hibernate.atlassian.net/browse/HHH-10032

Các vấn đề liên quan