我将 Access 与 SQL Server 结合使用,在客户表中(客户出生日期是可选列),如果用户在通过记录为 (30/12/1899) 的存储过程日期创建记录时将其留空,如屏幕截图所示:
我找到了这个解决方案,但我真的不知道我到底需要在代码或数据库中更改哪里。
我已经尝试在
access.vba
中使用以下代码来传递空日期
cmd.Parameters.Append cmd.CreateParameter("@p_custi_birth_date", adDBTimeStamp, adParamInput, , Format(CDate(Nz(!custi_birth_date, Empty)), "YYYY-MM-DD"))
这是存储过程中如果参数为空则记录null的SQL语句
CAST(NULLIF(@p_custi_birth_date, '') AS DATE)
我不太确定 vba 方面 - 我假设您遵循您发布的链接中的建议,即确保您将日期作为字符串传递,并且该字符串是有效日期sql server 可以理解的字符串 - 在我看来这意味着使用
yyyy-mm-dd
或 yyyymmdd
,not 使用 mm/dd/yyyy
或 dd/mm/yyyy
,尽管如果必须的话请随意尝试后者。
但在存储过程中,我认为您不想将空字符串转换为日期(您将得到像 1900-01-01 这样的日期,这不是您想要的)。因此,这可能更适合您的存储过程(假设传入有效的日期字符串,或者空字符串,或者可能为 null):
-- //@p_custi_birth_date is a date string such as '2000-12-31'
case
when isnull(@p_custi_birth_date, '') = '' then null
else cast(@p_custi_birth_date as date)
end
在 Access 和 SQL Server 中,您可以使用
ISDATE
测试变量。
对于 SQL Server,可以是:
IIF(NOT ISDATE(@p_custi_birth_date), NULL, CAST(@p_custi_birth_date AS DATE))
访问权限
IIf(IsNull(@p_custi_birth_date),Null,CDate(@p_custi_birth_date))