El parámetro @x no se definió para el procedimiento almacenado ... con MS_SQL JDBC

Estoy tratando de ejecutar un procedimiento almacenado usando JDBC de SQL Server en un método:

//Connection connection, String sp_name, Map<String, Object>params input to the method
DatabaseMetaData dbMetaData = connection.getMetaData();
HashMap<String, Integer> paramInfo = new HashMap<String, Integer>();
if (dbMetaData != null)
{
        ResultSet rs = dbMetaData.getProcedureColumns (null, null, sp_name.toUpperCase(), "%");
        while (rs.next())
            paramInfo.put(rs.getString(4), rs.getInt(6));
        rs.close();
}
String call = "{ call " + sp_name + " ( ";
for (int i = 0; i < paramInfo.size(); i ++)
    call += "?,";
if (paramInfo.size() > 0)
    call = call.substring(0, call.length() - 1);
call += " ) }";
CallableStatement st = connection.prepareCall (call);
for (String paramName: paramInfo.keySet()){
    int paramType = paramInfo.get(paramName);
    System.out.println("paramName="+paramName);
    System.out.println("paramTYpe="+paramType);
    Object paramVal = params.get(paramName);
    st.setInt(paramName, Integer.parseInt(((String)paramVal))); //All stored proc parameters are of type int
}

Digamos que el nombre del procedimiento almacenado esABC y el parámetro es@a. AhoraDatabaseMetaData devuelve el nombre de la columna@a pero ambientandost.setInt("@a",0) devuelve el siguiente error:

com.microsoft.sqlserver.jdbc.SQLServerException: el parámetro @a no se definió para el procedimiento almacenado ABC.

En cambio, probé esto:st.setInt("a",0) y se ejecutó perfectamente.

Ahora el problema es que tengo que establecer los parámetros dinámicamente ya que tengo demasiados procedimientos almacenados y demasiados parámetros, pero jdbc está dando error.

Editar 1:

Como se señaló en una respuesta, mi pregunta es un duplicado de:Parámetros con nombre en JDBC, Me gustaría explicar que el problema aquí no son los parámetros nombrados o los posicionales, sino que se trata de que JDBC no maneje los parámetros del servidor SQL en sí mismo o que cometa algún error al invocarlo.

Respuestas a la pregunta(1)

Su respuesta a la pregunta