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

A-K*_*A-K 6 sql sql-server calculated-columns sql-server-2008 persisted-column

我试图使用CASE表达式创建一个持久的计算列:

ALTER TABLE dbo.Calendar ADD PreviousDate AS 
case WHEN [Date]>'20100101' THEN  [Date]
    ELSE NULL
    END PERSISTED
Run Code Online (Sandbox Code Playgroud)

MSDN清楚地说CASE是确定性的,在这里

但是,我收到一个错误:

消息4936,级别16,状态1,行1"表日历"中的计算列"PreviousDate"无法保留,因为该列是非确定性的.

当然,我可以创建一个标量UDF并明确声明它是确定性的,但是有更简单的方法吗?我已经在获取最新的服务包了.谢谢.

gbn*_*gbn 17

你需要CONVERT'20100101'的风格.

源或目标类型是datetime或smalldatetime,其他源或目标类型是字符串,并指定了不确定的样式.

所以,试试这个:

...WHEN [Date] > CONVERT(datetime, '20100101', 112)....
Run Code Online (Sandbox Code Playgroud)

从字符串解析日期可能不可靠,因为我之前已经回答过(主要是在评论中)

编辑:

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


Cha*_*ion 5

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

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