1

首先,代码。我正在做一个查询结构:

<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 中不可能?

4

2 回答 2

6

问题是,您正在传递一个带有必须由 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>
于 2017-10-11T13:32:46.717 回答
0

您可以先使用 cfparam 建立 arguments.a1 和数据类型,然后在查询中将变量引用为“#arguments.a1#”。它至少应该可以帮助您确定是否是导致问题的 cfqueryparam 标记。

于 2017-10-17T18:44:45.613 回答