Coldfusion: выполнение динамического запроса, содержащего cfqueryparam

Во-первых, код. Я делаю структуру запросов:

<cfset myQueryStruct = { 
qone = "select * from t1 where column = <cfqueryparam cfsqltype='cf_sql_varchar' value='#arguments.a1#'>",
qtwo = "select * from t2 where column = <cfqueryparam cfsqltype='cf_sql_varchar' value='#arguments.a1#'>"
}>

Мне нужно выполнять запросы динамически, как показано ниже:

<cfquery name="qName" datasource="#dsn#">
    #myQueryStruct[arguments.type]#
</cfquery>

Но я получаю сообщение об ошибке:

Error Executing Database Query.
[Macromedia][SQLServer JDBC Driver][SQLServer]Incorrect syntax near '<'. 

Кажется, ошибка связана с "<cfqueryparam cfsqltype='cf_sql_varchar' value='#arguments.a1#'>" в запросе ("‹")

Я попытался использовать evaluate() и получил эту ошибку:

Invalid CFML construct found on line 1 at column 15.
ColdFusion was looking at the following text:

t1

Я знаю, что мы можем сделать это, используя лестницу <cfif> внутри <cfquery>, но мой вопрос в том, можем ли мы сделать это так, как я упомянул (я должен что-то упустить), или это невозможно в CFML?


person Binod Kalathil    schedule 11.10.2017    source источник
comment
Вы можете изучить cfscript версию cfqueryparam. Не могу сказать наверняка, но похоже, что это может относиться к тому, что вы пытаетесь сделать. cfdocs.org/cfqueryparam   -  person snackboy    schedule 11.10.2017
comment
Использование CFQUERYPARAM похвально, но использовать их с динамическими запросами сложно. См. Ответ Андреаса ниже для решения. Тем временем рассмотрите возможность простого вывода вашего кода между тегами cfquery. Это то, для чего предназначен cfquery, и одно из мест, где я действительно предпочитаю теги сценарию, — это упрощает простое копирование из диспетчера SQL и добавление ваших привязок.   -  person Mark A Kruger    schedule 11.10.2017


Ответы (2)


Проблема в том, что вы передаете строку с тегом, который должен быть обработан ColdFusion. Но вы опоздали. CF уже проанализировал шаблон, поэтому строка остается непереведенной и поэтому выдает ошибку SQL.

Я не уверен, что именно вы хотели бы здесь сделать, возможно, что-то вроде этого кода сработает:

<cfscript>
dsn = "myDatabase";
criteria = "something";
myQueryStruct = {
    qone = "select * from t1 where column = ( :a1 ) ",
    qtwo = "select * from t2 where column = ( :a1 ) "
};

result1 = getQueryResult( queryString = myQueryStruct[ "qone" ], filterValue = criteria, dsn = dsn );
result2 = getQueryResult( queryString = myQueryStruct[ "qtwo" ], filterValue = criteria, dsn = dsn );

public function getQueryResult( queryString, filterValue, dsn ){
    var qry = new Query();
    var qryString = arguments.queryString;
    var queryResult = "";
    qry.setDatasource( arguments.dsn );
    qry.setSQl( qryString );
    qry.addParam( name="a1", value= arguments.filterValue, cfsqltype="cf_sql_varchar" ); 
    queryResult = qry.execute().getResult();
    return queryResult;
}
</cfscript>
person Andreas Schuldhaus    schedule 11.10.2017
comment
Спасибо, Андреас. Как вы думаете, возможно ли это с помощью тегов CFML? - person Binod Kalathil; 12.10.2017
comment
@Binod Почему не скрипт? - person Shawn; 13.10.2017
comment
В проекте не используется скрипт. Поэтому. Я новичок в экосистеме CF. Что вы думаете о двух вариантах - тег и скрипт? У каждого есть свои преимущества или один лучше? - person Binod Kalathil; 16.10.2017

Вы можете использовать cfparam, чтобы сначала установить arguments.a1 и тип данных, а затем просто ссылаться на переменные как «#arguments.a1#» в запросе. Это должно помочь вам, по крайней мере, выяснить, является ли тег cfqueryparam причиной проблемы.

person Jason Peterman    schedule 17.10.2017