代码之家  ›  专栏  ›  技术社区  ›  A-K

为什么我的CASE表达式是不确定的?

  •  6
  • A-K  · 技术社区  · 14 年前

    我正在尝试使用CASE表达式创建持久化的计算列:

    ALTER TABLE dbo.Calendar ADD PreviousDate AS 
    case WHEN [Date]>'20100101' THEN  [Date]
        ELSE NULL
        END PERSISTED
    

    MSDN清楚地说这个案子是确定的, here

    但是,我得到一个错误:

    消息4936,16级,状态1,行1 中的计算列“PreviousDate” 无法持久化表“Calendar” 因为这列是 不确定。

    当然,我可以创建一个标量UDF并显式地将其声明为确定性的,但是有更简单的方法吗?我正在获取最新的服务包。谢谢。

    2 回复  |  直到 13 年前
        1
  •  17
  •   Community rcollyer    7 年前

    你需要 CONVERT '20100101' with a style.

    源或目标类型是datetime或 smalldatetime,其他源或 目标类型是字符串,并且

    所以,试试这个:

    ...WHEN [Date] > CONVERT(datetime, '20100101', 112)....
    

    I've answered before (mostly in comments)

    编辑:

    我不会说这是一个错误,但SQL Server要求100%的澄清。yyyymmdd不是ISO,SQL Server解析yyyy mm dd不可靠(请参阅我的答案链接)

        2
  •  5
  •   ChaosPandion    14 年前

    显然,它对数据类型非常挑剔。尝试这样做:

    ALTER TABLE dbo.Calendar ADD PreviousDate AS 
    case WHEN [Date ]> Convert(DateTime, '20100101', 101) THEN  [Date]
        ELSE Convert(DateTime, NULL, 101)
        END PERSISTED