我想到了两个选项:您可以让它像包含一样工作,也可以将其作为函数调用。
隔离包含(不太常见)
your_query.cfm
<!--- declaring possible incoming parameters --->
<cfparam name="attributes.datasource" type="string" default="dsn">
<cfparam name="attributes.divisionCode" type="string" default="">
<cfparam name="attributes.districtCode" type="string" default="">
<cfparam name="attributes.siteCode" type="string" default="">
<cfparam name="attributes.regionCode" type="string" default="">
<!--- declaring outgoing variable --->
<cfparam name="attributes.variable" type="string" default="your_query">
<!--- retrieve result --->
<cfquery name="Summary" datasource="#attributes.datasource#">
SELECT
*
FROM
disposal
WHERE 1=1
<cfif len(attributes.divisionCode) gt 0>
AND DivisionCode = <cfqueryparam value="#attributes.divisionCode#" cfsqltype="cf_sql_varchar">
</cfif>
<cfif len(attributes.districtCode) gt 0>
AND DistrictCode = <cfqueryparam value="#attributes.districtCode#" cfsqltype="cf_sql_varchar">
</cfif>
<cfif len(attributes.siteCode) gt 0>
AND SiteCode = <cfqueryparam value="#attributes.siteCode#" cfsqltype="cf_sql_varchar">
</cfif>
<cfif len(attributes.regionCode) gt 0>
AND RegionCode = <cfqueryparam value="#attributes.regionCode#" cfsqltype="cf_sql_varchar">
</cfif>
ORDER BY
CYear DESC
</cfquery>
<!--- set outgoing variable --->
<cfset caller[attributes.variable] = Summary>
invoking.cfm
<cfmodule divisionCode="foo" regionCode="bar" variable="my_query" template="your_query.cfm">
<cfdump var="#my_query#">
<!--- or --->
<cfset params = {}>
<cfset params.siteCode = "bla">
<cfif structKeyExists(url, "regionCode")>
<cfset params.regionCode = url.regionCode>
</cfif>
<cfmodule attributeCollection="#params#" template="your_query.cfm">
<cfdump var="#your_query#">
<!--- etc. --->
<cfmodule> 标记将其内容隔离开来,这意味着调用模板 (invoking.cfm) 不能看到 your_query.cfm 内的任何变量(分配给 caller 范围的变量除外)。这种方法基本上是原生 CF 标签如 <cfhttp> 和 <cffile> 所做的。
功能(更常见)
<cffunction name="yourQuery" access="public" output="false" returnType="query">
<!--- declaring possible incoming parameters --->
<cfargument name="datasource" type="string" default="dsn">
<cfargument name="divisionCode" type="string" default="">
<cfargument name="districtCode" type="string" default="">
<cfargument name="siteCode" type="string" default="">
<cfargument name="regionCode" type="string" default="">
<!--- retrieve result (the local. scope makes the variable exist in this function only) --->
<cfquery name="local.Summary" datasource="#arguments.datasource#">
SELECT
*
FROM
disposal
WHERE 1=1
<cfif len(arguments.divisionCode) gt 0>
AND DivisionCode = <cfqueryparam value="#arguments.divisionCode#" cfsqltype="cf_sql_varchar">
</cfif>
<cfif len(arguments.districtCode) gt 0>
AND DistrictCode = <cfqueryparam value="#arguments.districtCode#" cfsqltype="cf_sql_varchar">
</cfif>
<cfif len(arguments.siteCode) gt 0>
AND SiteCode = <cfqueryparam value="#arguments.siteCode#" cfsqltype="cf_sql_varchar">
</cfif>
<cfif len(arguments.regionCode) gt 0>
AND RegionCode = <cfqueryparam value="#arguments.regionCode#" cfsqltype="cf_sql_varchar">
</cfif>
ORDER BY
CYear DESC
</cfquery>
<!--- return result --->
<cfreturn local.Summary>
</cffunction>
invoking.cfm
<cfset my_query = yourQuery("dsn", "foo", "", "bar")>
<cfdump var="#my_query#">
<!--- or --->
<cfset your_query = yourQuery(
datasource: "dsn",
siteCode: "bla"
regionCode: ( structKeyExists(url, "regionCode") ? url.regionCode : "" )
)>
<cfdump var="#your_query#">
<!--- etc. --->
这应该让您对自己可以实现的目标有所了解。