【问题标题】:Datetime column cannot be pesisted日期时间列不能被保留
【发布时间】:2021-12-28 22:51:35
【问题描述】:

我有这个 SQL 语句来创建一个存储 JSON 字符串数据和在该 JSON 字符串中找到的事件时间的表。

CREATE TABLE [dbo].[EventLog] 
(
    [EventID]           INT NOT NULL IDENTITY(1,1),
    [EventTime]         AS CAST(JSON_VALUE(RawEvent, '$.EventTime') AS DATETIME ) PERSISTED,
    [RawEvent]          NVARCHAR(MAX) NOT NULL
)

但是,当我运行它时出现以下错误,我假设 SQL Server 不知道该值是否适合 DATETIME?有没有办法定义这个列?

消息 4936,第 16 级,状态 1,第 26 行 表 'Event' 中的计算列 'EventTime' 无法持久化,因为该列是不确定的。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    只要指定某些日期样式,您就可以将CONVERT 与日期一起使用并具有确定性的行为。根据文档here,使用最常见的 JavaScript 日期格式(因为您是从 JSON 转换而来的),您可以使用样式 126 或 127,它们是带时区的 ISO8601 和 ISO8601。那么,您的表可以这样指定:

    CREATE TABLE [dbo].[EventLog] 
    (
        [EventID]           INT NOT NULL IDENTITY(1,1),
        [EventTime]         AS CONVERT(DATETIME, JSON_VALUE(RawEvent, '$.EventTime'), 126) PERSISTED,
        [RawEvent]          NVARCHAR(MAX) NOT NULL
    )
    

    【讨论】:

    • 这正如我所描述的那样工作,因此比实际标记为答案的回复要好得多。
    【解决方案2】:

    唉,这在documentation中有解释:

    CAST Deterministic 除非与 datetime、smalldatetime 或 sql_variant 一起使用。

    您可以使用datefromparts() 或datetimefromparts() 解析日期并重建值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2021-11-10
      • 2016-04-16
      • 1970-01-01
      相关资源
      最近更新 更多