【问题标题】:Converting Access application with linked tables to SQL Server 2014将带有链接表的 Access 应用程序转换为 SQL Server 2014
【发布时间】:2015-02-17 14:20:35
【问题描述】:

我们有一个使用 SQL Server 2000 ODBC DSNless 链接表的 Access 应用程序。我们正在升级到 SQL Server 2014,我正在改变使用连接字符串

ODBC;DRIVER=SQL Server;..." to ODBC;DRIVER=SQL Server Native Client 11.0;...

应用程序在转换后工作,除非我尝试使用此 where 子句运行查询,但它在此 WHERE 子句上失败:

WHERE [Expiration Date] < #8/17/2015# 

错误信息是

ODBC 调用失败:从字符串转换日期和/或时间时转换失败。 (#241)

更新:过去使用 where 子句的查询是基于查询 SQL Server 数据库的查询的访问查询。

【问题讨论】:

  • 日期文字的含义取决于语言。是DD/MM/YYYY 还是MM/DD/YYYY?这就是为什么建议使用不依赖于语言的文字格式。在您的情况下,您可以将 SQL Server 2000 配置为美国英语,并将新的 SQL Server 2014 配置为英国英语。如果 SQL Server 需要 DD/MM/YYYY,那么它将无法转换 8/17/2015

标签: sql-server ms-access sql-server-2014


【解决方案1】:

SQL Server 不使用 MS Access 日期格式,尤其是在使用 # 时。 Date functions in SQL Server 的格式如下:

  • 日期 - 格式 YYYY-MM-DD
  • DATETIME - 格式:YYYY-MM-DD HH:MI:SS
  • SMALLDATETIME - 格式:YYYY-MM-DD HH:MI:SS
  • TIMESTAMP - 格式:唯一编号

此外,MS Access 的 JET/ACE SQL 引擎是与 SQL Server 不同的 SQL 方言,因此每个查询语句可能不兼容。如果您将 SQL Server 迁移到 Oracle、MySQL、PostgreSQL、db2 等等,情况就是如此。

【讨论】:

  • 我意识到 # 用于格式化访问日期。我想弄清楚为什么它适用于 SQL 2000 驱动程序但不适用于 SQL 2014。我想避免更改大量查询和代码。
  • 除了 MS Access 和 Windows 升级之外,软件发布 14 年之间还有很多原因:DLL、注册表项、驱动程序、32 位/64 位问题等等。但是,这里有一个相关的SO post。也许更改 SQL Server 中的日期类型可能会起作用。此外,请查看此信息 piece,了解 MSSQL 版本之间的日期/时间类型更改。
【解决方案2】:

如果 SQL Server 中的列格式是 DateTime 而不是 DateTime2,那么试试下面的

 WHERE Format([Expiration Date],"dd-mmm-yyyy") < Format(#8/17/2015#,"dd-mmm-yyyy")

或者

Datediff("d",Format([Expiration Date],"dd-mmm-yyyy"), Format(#8/17/2015#,"dd-mmm-yyyy")) < 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多