NamedParameterJdbcTemplate с SQL Server: неверный синтаксис рядом с '@P0'

У меня есть следующий код, который выполняет запрос к базе данных SQL Server. я читал эти ссылки

http://jenikya.com/blog/2009/02/sqlexception-select-top-number.html

Исключение MS SQL: неправильный синтаксис рядом с '@P0'

но я все еще не понимаю, где/почему я получаю проблему «@P0». Я заключил параметр TOP в скобки.

private String DEP_AMC_QUERY = "SELECT TOP(1) ((fund_amc-reinsurance_premium)/1000) 

as dep_amc "+ "FROM Hedging_Staging.dbo.:table" + "ГДЕ внутренний_код_идентификатора_фонда=:фонд"+ "И load_id=:load_id;";

public BigDecimal getDepAmcValue(String fund,Long load_id,String table){

    NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(getDataSource());

    //Set up parameters
    MapSqlParameterSource namedParameters = new MapSqlParameterSource("fund",fund);
    namedParameters.addValue("load_id",load_id);
    namedParameters.addValue("table",table);
    MapUtils.debugPrint(System.out,"params", namedParameters.getValues());

    //Execute query
    return jdbcTemplate.queryForObject(DEP_AMC_QUERY,namedParameters,BigDecimal.class);
}

Консоль и сообщение об исключении

13:11:12,871 INFO  [ReinsuredFundAssetProcessor] looking up dep_amc value for AXX in AI_IFL_Policy table.

params = 
{
    table = AI_IFL_Policy java.lang.String
    fund = AXX java.lang.String
    load_id = 4356 java.lang.Long
} 
13:11:12,909 ERROR [AbstractStep] Encountered an error executing the step
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [select top(1) ((fund_amc-reinsurance_premium)/1000) as dep_amc from Hedging_Staging.dbo.? WHERE internal_fund_code_identifier=? AND load_id=?;]; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '@P0'.
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:98)

Любые идеи?


person emeraldjava    schedule 26.04.2014    source источник
comment
Заполнители разрешены только в предложении where, но не для имен таблиц. Значит первый? (table в вашем случае) не будет заменен фактическим базовым подготовленным оператором.   -  person M. Deinum    schedule 26.04.2014
comment
думаю, мне придется провести рефакторинг, чтобы использовать запрос StringBuilder/jdbc, который не поддерживается подготовленным оператором.   -  person emeraldjava    schedule 26.04.2014
comment
Нет, вы можете сами заменить :table и передать полученный sql в (NamedParameter)JdbcTemplate.   -  person M. Deinum    schedule 26.04.2014