动态构建查询参数

时间:2011-12-19 23:35:53

标签: coldfusion

您好我正在尝试动态构建查询参数,并且收到错误,我正在使用下面的代码,

<cfset featQuery="">
<cfloop list="#arguments.uid_features#" index="x">
<cfif x neq "0">
<cfif Len(featQuery) gt 0>
<cfset featQuery = featQuery& " AND ">
</cfif>
<cfset featQuery = featQuery & 'uid_prodf_featid = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="' & x & '">'>
</cfif>
</cfloop>

我从coldfusion收到此错误消息; [Macromedia] [SQLServer JDBC驱动程序] [SQLServer]'&lt;'附近的语法不正确。

如果我查看输出,它看起来是正确的,但是正常使用cfquerypram,你只需在错误消息中得到(param1),uid_prodf_featid =(param1)它会显示以下内容;

uid_prodf_featid = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="5"> 

杰森

1 个答案:

答案 0 :(得分:2)

您无法像尝试那样动态地构建和执行CFML。在我看来,你正试图在cfquery标签上下文之外构建一个SQL查询;除了你需要参数化之外,这没关系。如果可能,请将代码更改为在cfquery标记对中运行:

<cfquery...>
SELECT * FROM tableFoo
<cfif ListLen(arguments.uid_features)>
 WHERE uid_prodf_featid IN (<cfqueryparam value="#arguments.uid_features#" list="true" cfsqltype="CF_SQL_INTEGER">)
</cfif>
</cfquery>

另外,正如您所看到的,我已经更改了您的查询结构 - 您有很多代码可以执行更容易实现的操作,如上所示。

修改

我看到你实际上正在对你的uid_features列表中的每个项目进行AND操作......我很难想象有一个有效的逻辑原因(而不是OR),但如果是这样,我的例子赢了“为此工作 - 而是将其改回循环中的一系列AND条件。