我终于创建了这个辅助函数来构建可复制的查询行:
<cffunction name="limnSQLDump" output="no" access="public" returntype="string">
<cfargument name="sql" required="yes" type="string">
<cfargument name="params" required="yes" type="string">
<cfset var arrParam = ListToArray(arguments.params, ' , ', false, true)> <!--- Arrayify Dat Param String --->
<cfset var sub = StructNew()>
<cfset var objParam = StructNew()>
<cfloop from="1" to="#ArrayLen(arrParam)#" index="i"> <!--- Loop through each param string --->
<cfset arrParam[i] = REReplace(arrParam[i], '\(param \d+\) = \[([^\]]+)\]', '\1', 'all')> <!--- Scoop out the meat --->
<cfset sub = REFind("([^=, ]+)='([^']*)'", arrParam[i], 1, true)> <!--- Prep For Surgery --->
<cfset objParam = StructNew()> <!--- Preheat oven --->
<cfloop condition="#sub.pos[1]#"> <!--- Surgically get Key/Value --->
<cfset objParam[Mid(arrParam[i], sub.pos[2], sub.len[2])] = Mid(arrParam[i], sub.pos[3], sub.len[3])>
<cfset sub = REFind("([^=, ]+)='([^']*)'", arrParam[i], sub.pos[1]+sub.len[1], true)>
</cfloop>
<!--- Serve (Feeds 3) --->
<cfset sql = REReplace(sql, '\(param '&i&'\)', (objParam.class NEQ 'java.lang.Integer' ? "'"&objParam.value&"'" : objParam.value))>
</cfloop>
<cfreturn sql>
</cffunction>
在我解决这个问题之前,我自己经历了无数不同的路线(从具体到抽象再返回),任何反馈都将不胜感激。最后,我决定将整个参数字符串分解成一个数组(毕竟它基本上是一个数组),正则表达式确切的参数并用它替换整个字符串,然后循环遍历参数并使对象等效,以便在对 SQL 字符串进行替换时,可以使用 REReplace 清楚地引用它。
我个人本来希望能够简单地做一些类似于<cfset arrParam[i] = Evaluate("{"&arrParam[i])&"}">
考虑到这一点的事情,除了括号之外,参数内容基本上是一个内联对象。