我已经创建了一个SQL存储过程:
CREATE PROCEDURE usp_MyTableInsert
...
@name varchar(100),
@birthdate datetime = NULL,
@phoneno varchar(10),
...
我从ColdFusion代码中调用它:
<cfstoredproc
datasource="training"
procedure="usp_MyTableInsert">
....
<cfprocparam cfsqltype="CF_SQL_VARCHAR" value="#form.name#" dbvarname="@name">
<cfprocparam cfsqltype="CF_SQL_DATE" value="#ParseDateTime(form.birthdate)#" dbvarname="@birthdate">
<cfprocparam cfsqltype="CF_SQL_VARCHAR" value="#form.phoneno#" dbvarname="@phoneno">
....
</cfstoredproc>
如果我不想将生日作为参数传递怎么办?它应该采用NULL值,因为我在SP中将其设置为默认值。 如果我删除它,它给我一个错误,如无法将varchar转换为datetime,这意味着我们需要以正确的顺序传递所有参数。
谢谢..
答案 0 :(得分:4)
我个人的偏好是使用“null”属性的快捷方式,使用适当的日期检查。但只要提供所有必需的属性(例如cfsqltype),这两种技术都是有效的。
旁注“dbvarname”已弃用,因此请勿在新应用程序中使用它。
<cfstoredproc
datasource="training"
procedure="usp_MyTableInsert">
...
<cfprocparam cfsqltype="CF_SQL_VARCHAR" value="#form.name#">
<cfprocparam cfsqltype="CF_SQL_DATE" value="#form.birthdate#" null="#not IsDate(form.birthdate)#">
<cfprocparam cfsqltype="CF_SQL_VARCHAR" value="#form.phoneno#">
....
</cfstoredproc>
答案 1 :(得分:3)
请参阅the docs。
<cfstoredproc datasource="training" procedure="usp_MyTableInsert">
....
<cfprocparam value="#form.name#" dbvarname="@name">
<cfif IWantToPassInBirthday eq "YES">
<cfprocparam value="#ParseDateTime(form.birthdate)#" dbvarname="@birthdate">
<cfelse>
<cfprocparam null="YES" dbvarname="@birthdate">
</cfif>
<cfprocparam value="#form.phoneno#" dbvarname="@phoneno">
....
</cfstoredproc>