簡體   English   中英

調用SQL Server存儲過程的“'{'附近的語法不正確”

[英]“Incorrect syntax near '{'” calling SQL Server stored procedure

我正在嘗試從存儲過程中獲取結果,並且出現ERROR: Incorrect syntax near '{'. 我看到許多示例對sql string使用相同的東西,但我不確定為什么會出錯..我有相同數量的參數...

當我像這樣在數據庫中執行存儲過程時

exec rptGetAssetbyLocation '2122我得到了5列

如何使用Callable Statement返回結果? 我用registerOutParameter做錯了什么?

try
        {
         Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                                String url = "jdbc:sqlserver:...";
                                String username = "username";
                                String 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>");

            String 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");
                String tag = rs.getString("tag");
                String name = rs.getString("name"); 
                String model = rs.getString("model"); 
                String serNum = rs.getString("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);
    }

如果您要做的所有在SQL Server Management Studio(SSMS)中運行存儲過程的操作,

exec rptGetAssetbyLocation '2122' 

那么您可能不需要弄亂輸出參數,只需使用一個輸入參數來調用存儲過程,然后像這樣從ResultSet中檢索結果

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

除了Gord Thompson的回答之外,您還可以將JDBC調用轉義用於存儲過程。

JDBC轉義是JDBC標准中定義的非常特殊的轉義,用於消除SQL實現之間的差異。 JDBC轉義被轉換為數據庫服務器特定的語法。

對於調用存儲過程,轉義為:

{call procname(arg1, ..,)}

或對於具有返回值的存儲過程:

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

其中arg1等是文字值或參數占位符。 請參閱CallableStatement apidoc。 在准備或執行后,驅動程序會將其轉換為數據庫語法(例如,對於SQL Server,為EXEC procname arg1, ... )。

您在問題中嘗試使用的語法是JDBC轉義( {...} )和執行存儲過程的SQL Server特定語法之間的混合。

同樣,存儲過程的結果可能不是out參數,而是ResultSet ,但這取決於存儲過程的定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM