在2016年CF峰会上,建议不要使用cfquery标签调用存储过程,而是使用cfstoredproc。我有一个前一个程序员使用cfquery调用的proc,我想重写它以使用cfstoredproc。但是,proc有很多参数,我只想传递3,其余的都是默认值。但是,我们正在运行CF10,因此dbvarname不是cfprocparam的属性,并且在CF11之前不会添加回来。
关于安全性或执行速度,是否有任何理由我不应该以这种方式调用proc?:
<cfquery datasource="#application.dsn#" name="myResult">
EXEC p_myProc
@type_id=3
,@action_id=0
,@id=<cfqueryparam cfsqltype="cf_sql_integer" value="#id#" />
</cfquery>
我可以这样使用cfprocparam,确保我传递的参数是proc中定义的前三个并且顺序正确:
<cfstoredproc datasource="#application.dsn#" result="myResult" procedure="p_myProc">
<cfprocparam cfsqltype="cf_sql_integer" value="3" />
<cfprocparam cfsqltype="cf_sql_integer" value="0" />
<cfprocparam cfsqltype="cf_sql_integer" value="#id#" />
</cfstoredproc>
但是,如果这3个参数在中间定义,或者不按直接顺序定义怎么办?我宁愿不必为每一个param传递一个值,因为那是很多的输入,我必须在proc中查找它们的默认值,这些默认值总是可以改变然后CF代码会超越他们。