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

时间:2010-08-29 21:23:12

标签: sql sql-server sql-server-2008 calculated-columns persisted-column

我正在尝试使用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并明确声明它是确定性的,但有更简单的方法吗?我已经在获取最新的服务包了。感谢。

2 个答案:

答案 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