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

Pass null datetime value to SQL Server stored procedure in VBA Access

提问人:A.J 提问时间:8/8/2023 最后编辑:marc_sA.J 更新时间:8/9/2023 访问量:81

问:

我在客户表中将 Access 与 SQL Server(客户出生日期是可选列)一起使用,如果用户在按存储过程日期创建记录时将其保留为 null,则记录为 (30/12/1899),如屏幕截图所示:

after creating record birth date field

我找到了这个解决方案,但我真的不知道我需要在代码或数据库中更改的位置。

我已经尝试按照代码传递空日期access.vba

cmd.Parameters.Append cmd.CreateParameter("@p_custi_birth_date", adDBTimeStamp, adParamInput, , Format(CDate(Nz(!custi_birth_date, Empty)), "YYYY-MM-DD"))

这是存储过程中的 SQL 语句,用于在参数为空时记录 null

CAST(NULLIF(@p_custi_birth_date, '') AS DATE)
sql-server vba ms-access-2016

评论

1赞 topsail 8/8/2023
您帖子中的链接问题建议为您的参数使用数据类型 - 但您的代码仍在使用 .我不确定你为什么说你不知道在代码中在哪里更改它。它正好在您发布的行中 - 更改为 .尝试该修复程序怎么样?虽然我不确定迄今为止的强制转换是否真的可以在您的存储过程中工作......adVarCharadDBTimeStampadDBTimeStampadVarChar''
0赞 A.J 8/8/2023
我在数据库中尝试了 nvarchar,但我无法处理 Access 和 SQL Server 之间 nvarchar 的转换,由于 Windows 日期格式、Access 记录集或 SQL Server 强制转换,总是出错,如果我转换为 nvarchar,我需要每次在查询中选择、更新、插入和所有方程式时处理它取决于两个日期之间的差异。
0赞 topsail 8/8/2023
你最后的评论很难理解。看来你想多了。如果要传递日期字符串,则要将其转换为存储过程中的日期。在这种情况下,一切都应该没问题。
1赞 Nick.Mc 8/8/2023
这一切都令人困惑,但一个非常明确的建议是只使用数据类型。不要使用字符数据类型。字符数据类型是不必要的,只会混淆问题。date

答:

0赞 topsail 8/8/2023 #1

我不太确定 vba 方面 - 我将假设您遵循您发布的链接中的建议,以确保您将日期作为字符串传递,并且该字符串是 sql server 理解的有效日期字符串 - 在我看来,这意味着使用 or ,而不是使用 or , 不过,如果必须的话,请随时尝试后者。yyyy-mm-ddyyyymmddmm/dd/yyyydd/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赞 A.J 8/8/2023
我认为问题出在一边,因为我试图在 SQL Server 中手动执行存储过程,并且我传递了 null 日期并且每件事都做得很好,所以问题仍在访问中,我无法将 null 日期传递给 SQL Serverms.access
0赞 topsail 8/8/2023
你试过这些建议吗?您发布的链接中有一个(传递一个而不是(在这种情况下,您可以传递 null 或空字符串,或者格式化的日期字符串,以便 sql server 可以使用它)。nbk发布的另一个答案中还有另一个建议。advarcharadDbTImeStamp
1赞 A.J 8/9/2023
我总是尽量避免使用日期,因为在SQLServer之间真的很难处理,我尝试过,但总是在访问代码中显示错误varcharaccessand
0赞 nbk 8/8/2023 #2

在 Access 和 SQL Server 中,可以使用 测试变量。ISDATE

对于 SQL Server,它可以是:

IIF(NOT ISDATE(@p_custi_birth_date), NULL, CAST(@p_custi_birth_date AS DATE))

对于访问

IIf(IsNull(!custi_birth_date),Null,CDate(!custi_birth_date))

评论

0赞 A.J 8/9/2023
运行时错误 94 无效使用 null ,我认为日期字段不使用 Null 概念
0赞 nbk 8/9/2023
不,这意味着在您的表定义中您不允许 null,但是正如您想要的 null 我假设您的字段可以接受 null,因此您需要更改列