将空日期时间值传递给 VBA Access 中的 SQL Server 存储过程

问题描述 投票:0回答:2

我将 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)
sql-server vba ms-access ms-access-2016
2个回答
0
投票

我不太确定 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

0
投票

在 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))
© www.soinside.com 2019 - 2024. All rights reserved.