6

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

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

MSDN明确说CASE是确定性的,这里

但是,我收到一个错误:

消息 4936,级别 16,状态 1,第 1 行表“日历”中的计算列“PreviousDate”无法保留,因为该列是不确定的。

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

4

2 回答 2

17

您需要使用样式转换“20100101”。

源或目标类型为 datetime 或 smalldatetime,其他源或目标类型为字符串,并指定了非确定性样式。

所以,试试这个:

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

正如我之前回答的那样,从字符串解析日期可能不可靠(主要在评论中)

编辑:

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

于 2010-08-29T21:30:11.420 回答
5

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

ALTER TABLE dbo.Calendar ADD PreviousDate AS 
case WHEN [Date ]> Convert(DateTime, '20100101', 101) THEN  [Date]
    ELSE Convert(DateTime, NULL, 101)
    END PERSISTED
于 2010-08-29T21:30:34.523 回答