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
源或目标类型是datetime或smalldatetime,其他源或目标类型是字符串,并指定了不确定的样式.
所以,试试这个:
...WHEN [Date] > CONVERT(datetime, '20100101', 112)....
Run Code Online (Sandbox Code Playgroud)
从字符串解析日期可能不可靠,因为我之前已经回答过(主要是在评论中)
编辑:
我不会说这是一个错误,但SQL Server要求100%澄清.yyyymmdd不是ISO和SQL Server解析yyyy-mm-dd是不可靠的(请参阅我的回答链接)
显然,它对数据类型非常挑剔.试着这样做:
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)