问题描述
在Access前端VBA过程中,我发现了几篇关于将GETDATE()函数用于sql Server链接表的文章。这些帖子主要关注查询的WHERE子句,但是我无法找到有关使用GETDATE()进行列分配的相应信息。
例如,我了解在WHERE子句中,我将使用以下内容:
WHERE MyDate = CAST(GETDATE() AS DATE)
但是,当我尝试将当前日期分配给一列时,我在VBA中遇到语法错误,
INSERT INTO MyTable ( SomeValue,TheDate ) SELECT 'Widget' AS Expr1,CAST(GETDATE() AS DATE) AS Expr2;
在此示例中,TheDate在sql Server中定义为DateTime。这样写,VBA报告“查询表达式'CAST(GETDATE()AS DATE)中的语法错误(缺少运算符)'。我试图用可访问访问的#日期分隔符括住该表达式,但没有运气。
花了大约30分钟的时间以各种方式在sql中搜索stackexchange.com上的MS Access Date()之后,我一直找不到。但是,它是如此简单,我相信它已经在某个地方得到了回答。
解决方法
在MS Access中,您可能应该使用Now()
和Date()
函数(不一定100%肯定要对链接的SQL进行实验)。第一个等效于SQL中的getdate()
,第二个返回不带时间的当前日期。
如果在Access中对链接表(而不是PT查询)运行此命令,则应显示为:
INSERT INTO MyTable ( SomeValue,TheDate )
VALUES ('Widget',Date());
,
这里似乎有些混乱。如果您构建一个Access查询,则SQL Server日期函数和语法的ZERO ZERO为零。除非您使用传递查询,否则您的SQL必须继续按照Access标准编写。
但是,我在这里看到了100倍。 sql server端的数据类型是什么? 是datetime还是datetime2?
然后,在设计模式下,双击,三重,qudadropes(以及更多)检查链接表。
如果使用标准旧版“ SQL Server”驱动程序链接到SQL Server。自Windows 98SE以来已经出货20年了?
您必须检查Access是否将这些列视为文本或日期列(如果需要,Access中始终允许有时间部分)。
如果将数据从Access迁移到SQL Server并链接表,则访问代码,查询,表单和所有内容都需要零更改。再次:零零变化。
但是,如果您在SQL Server端使用了datetime2?然后,在链接表时,您将无法使用旧版“ SQL Server驱动程序”。原因是它们不支持较新的datetime2格式。结果,Access实际上将看到,使用和处理该列作为文本列。您确实,但确实不希望这种情况发生。 为什么? 因为然后您花了下个星期在SO上询问一些日期代码或列或查询如何不起作用的问题。 再次: 零需要在Access中进行更改。如果您的日期开始中断,那么问题不在于日期格式,而是现在可以通过访问将其视为TEXT数据类型。
解决方案: 将sql端的datetime2列更改为datetime,然后重新链接。
或 使用较新的本机11(或更高版本-现在最多18)重新链接表。这样,Access将在Access中看到/使用/处理datetime2为正确的日期格式。
那么,在您做什么之前?在设计模式下打开链接到SQL Server的Access表之一。 (忽略只读的prmompt)。现在,查看分配给日期列的数据类型。如果它们是文字,则说明您一团糟。
您需要使用较新的ODBC驱动程序重新链接。
如果您使用到sql server的链接表,应该触摸甚至更改现有代码,sql和quires的零。但是再说一次,如果您使用错误的SQL ODBC驱动程序进行链接,则Access无法查看或将那些datetime2列作为日期进行处理-它将使用文本,并且您实际上不希望允许这种情况发生。总结: 任何日期代码,SQL更新,排序,查询,VBA代码,表单代码,报告都应继续使用零更改。如果要在迁移后对日期进行更改,那么您会做错所有这些,并且访问不会将这些日期列视为日期列。
清除所有datetime2列,然后重新链接(将它们在服务器端更改为datetime)。或使用本机11或更高版本的ODBC驱动程序重新链接表。这些选择中的任何一个都可以解决此问题。
此修复程序需要零代码,并且Access处理日期的更改为零。