【问题标题】:SQL Server datetime2 parse issueSQL Server datetime2 解析问题
【发布时间】:2020-04-09 13:28:48
【问题描述】:

当我在本地 SQL Server 实例上运行以下 SQL 时:

DECLARE @t DATETIME2 = '2019-12-12 00:00:00'

我收到以下错误:

无法将 @t 转换为 System.Data.SqlClient.SqlParameter 对象。指定的文字无法转换为 DateTime2(System.Data.SqlDbType),因为它使用了不受支持的日期/时间格式。使用一种受支持的日期/时间格式。字面值:2019-12-12 00:00:00

修复它的唯一方法是在日期和时间之间添加“T”

DECLARE @t DATETIME2 = '2019-12-12T00:00:00'

同时,该脚本在我的生产服务器上运行得非常好(不添加“T”)。

我试图找出不同之处,但没有发现任何可能影响行为的东西:

  • 两台服务器上的排序规则相同 - SQL_Latin1_General_CP1_CI_AS
  • 语言相同 - 英语(美国)
  • 服务器版本:LOCAL 为 Microsoft SQL Server 2017 Developer Edition (64-bit) v14.0.2027 RTM; REMOTE 是 Microsoft SQL Server 2017 Enterprise Edition:基于内核的许可(64 位)v14.0.1000 RTM
  • 主机操作系统:本地是 Windows 10 Pro; REMOTE 是 Windows Server 2016 Datacenter

有人能解释一下,为什么我在本地收到错误吗?

【问题讨论】:

  • 如何执行该查询?从错误消息来看,您似乎有一个执行它的前端应用程序。请将其包含在您的问题中
  • 无法在 SSMS 中本地重现 Win10/SQL Server 2017 上的问题 - 工作正常。我同意@Squirrel:似乎您没有在 SSMS 中执行此操作,而是从某个应用程序执行此操作 - 也许该应用程序中的某些内容会导致此问题。 SQL Server 本身应该没问题
  • @Squirrel 我在 SSMS 中运行它。找到了原因和解决方案,感谢 Dan Guzman

标签: sql-server sql-server-2017


【解决方案1】:

这是一个客户端错误,因此您似乎正在使用远程客户端上的连接(连接选项-->始终加密)的启用始终加密(列加密)选项从 SSMS 运行查询,而不是产品服务器。启用该选项后,SSMS 客户端会解析文字以便为 AE 构建参数。

'2019-12-12 00:00:00' 不同,ISO 8601 datetime format 文字 '2019-12-12T00:00:00' 是明确的,并且无论客户端区域设置如何都可以可靠地解析。

因此,您的选择是使用 ISO 8601 日期时间格式或为连接打开 SSMS Enable AE 选项。

【讨论】:

    猜你喜欢
    • 2014-02-27
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2010-11-22
    相关资源
    最近更新 更多