"Syntaxe incorrecte près de '{'" appelant la procédure stockée SQL Server

J'essaye d'get des résultats de ma procédure stockée et j'obtiens ERROR: Incorrect syntax near '{'. . J'ai vu beaucoup d'exemples en utilisant la même chose pour une sql ssortingng et je ne suis pas sûr pourquoi je reçois une erreur .. J'ai la même quantité de parameters …

quand j'exécute ma procédure stockée om ma database comme celle-ci

exec rptGetAssetbyLocation '2122 ' Je reçois mes 5 colonnes

Comment puis-je get des résultats en utilisant Callable Statement? Je fais quelque chose de mal avec un registerOutParameter ?

 try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Ssortingng url = "jdbc:sqlserver:..."; Ssortingng username = "username"; Ssortingng password = "password"; sb.append("<table id=\"examplee\" border=1 >" + "<tr><td>ID</td><td>TAG</td><td>NAME</td>" + "<td>MODEL</td><td>SERIAL NUMBER</td></tr>"); Ssortingng query = "{exec rptGetAssetbyLocation(?,?,?,?,?)}"; Connection conn = DriverManager.getConnection(url, username, password); CallableStatement stmt = conn.prepareCall(query); stmt.registerOutParameter(1, java.sql.Types.INTEGER); stmt.registerOutParameter(2, java.sql.Types.VARCHAR); stmt.registerOutParameter(3, java.sql.Types.VARCHAR); stmt.registerOutParameter(4, java.sql.Types.VARCHAR); stmt.registerOutParameter(5, java.sql.Types.VARCHAR); ResultSet rs = stmt.executeQuery(); while (rs.next()) { int id = rs.getInt("ID"); Ssortingng tag = rs.getSsortingng("tag"); Ssortingng name = rs.getSsortingng("name"); Ssortingng model = rs.getSsortingng("model"); Ssortingng serNum = rs.getSsortingng("serialNumber"); sb.append("<tr><td>" + id + "</td>" + "<td>" + tag + "</td>" + "<td>" + name + "</td>" + "<td>" + model + "</td>" + "<td>" + serNum + "</td></tr>"); } sb.append("</table>"); } catch(Exception e) { sb.append("<h1>ERROR: " + e.getMessage() + "</h1>"); } sb.append("</body></html>"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(sb); } 

Si tout ce que vous faites pour exécuter votre procédure stockée dans SQL Server Management Studio (SSMS) est

 exec rptGetAssetbyLocation '2122' 

alors vous n'avez probablement pas besoin de jouer avec les parameters de sortie, vous pouvez simplement utiliser le paramètre one input pour appeler votre procédure stockée, puis récupérer les résultats du ResultSet comme ceci

 Ssortingng query = "exec rptGetAssetbyLocation ?"; Connection conn = DriverManager.getConnection(url, username, password); CallableStatement stmt = conn.prepareCall(query); stmt.setSsortingng(1, "2122"); ResultSet rs = stmt.executeQuery(); while (rs.next()) { int id = rs.getInt("ID"); Ssortingng tag = rs.getSsortingng("tag"); Ssortingng name = rs.getSsortingng("name"); Ssortingng model = rs.getSsortingng("model"); Ssortingng serNum = rs.getSsortingng("serialNumber"); // ...and do other useful stuff } 

En plus de la réponse de Gord Thompson , vous pouvez également utiliser l'échappement d'appel JDBC pour les procédures stockées.

Les échappements JDBC sont des échappements très spécifiques définis dans la norme JDBC pour combler les différences entre les implémentations SQL. Les échappements JDBC sont convertis à la syntaxe spécifique au server de database.

Pour appeler des procédures stockées, l'échappement est:

 {call procname(arg1, ..,)} 

ou pour une procédure stockée avec une valeur de return:

 {? = procname(arg1, ...)} 

arg1 etc est une valeur littérale ou un espace réservé de paramètre. Voir l'apidoc CallableStatement. Lors de la préparation ou de l'exécution, le driver traduira ceci par la syntaxe de la database (c'est-à-dire EXEC procname arg1, ... dans le cas du server SQL).

La syntaxe que vous avez essayé d'utiliser dans votre question est un mélange entre un échappement JDBC (le {...} ) et la syntaxe spécifique de SQL Server d'exécution d'une procédure stockée.

Le résultat de votre procédure stockée n'est probablement pas un paramètre out, mais un ResultSet , mais cela dépend de la définition de la procédure stockée.