我正在尝试使用CASE表达式创建一个持久的计算列:
ALTER TABLE dbo.Calendar ADD PreviousDate AS
case WHEN [Date]>'20100101' THEN [Date]
ELSE NULL
END PERSISTED
MSDN明确表示CASE具有确定性,here
然而,我收到一个错误:
Msg 4936,Level 16,State 1,Line 1 计算列'PreviousDate'中 表'日历'无法保留 因为列是 非确定性。
当然,我可以创建一个标量UDF并明确声明它是确定性的,但有更简单的方法吗?我已经在获取最新的服务包了。感谢。
答案 0 :(得分:17)
您需要CONVERT '20100101' with a style.
源或目标类型是datetime或 smalldatetime,另一个来源或 target type是一个字符串,和 指定了非确定性风格。
所以,试试这个:
...WHEN [Date] > CONVERT(datetime, '20100101', 112)....
从字符串解析日期可能不可靠I've answered before (mostly in comments)
编辑:
我不会说这是一个错误,但SQL Server要求100%澄清。 yyyymmdd不是ISO和SQL Server解析yyyy-mm-dd是不可靠的(参见我的回答链接)
答案 1 :(得分:5)
显然,对数据类型非常挑剔。试着这样做:
ALTER TABLE dbo.Calendar ADD PreviousDate AS
case WHEN [Date ]> Convert(DateTime, '20100101', 101) THEN [Date]
ELSE Convert(DateTime, NULL, 101)
END PERSISTED