6

我嘗試使用CASE表達式來創建一個持久化計算列:爲什麼我的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 Computed column 'PreviousDate' in table 'Calendar' cannot be persisted because the column is non-deterministic.

當然,我可以創建一個標量UDF並明確聲明它是確定性的,但是有沒有更簡單的方法呢?我已經在獲得最新的服務包了。謝謝。

+0

老問題,我知道,但你如何建議*「在SQL Server中創建一個標量UDF並顯式聲明它爲確定性」*。我被告知你可以在Oracle中這樣做,但是我從來沒有在SQL Server中看到過... – jimbobmcgee 2016-03-31 12:38:28

回答

17

您需要CONVERT '20100101' with a style.

Source or target type is datetime or smalldatetime, the other source or target type is a character string, and a nondeterministic style is specified.

所以,試試這個:從字符串

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

日期解析是不可靠的I've answered before (mostly in comments)

編輯:

我不會說這是一個錯誤,但SQL Server要求100%澄清。 yyyymmdd不是ISO和SQL Server解析yyyy-mm-dd是不可靠的(請參閱我的回答鏈接)

+0

+1 - 擊敗了我,唉! – 2010-08-29 21:33:33

5

顯然它對數據類型非常挑剔。嘗試這樣做:

ALTER TABLE dbo.Calendar ADD PreviousDate AS 
case WHEN [Date ]> Convert(DateTime, '20100101', 101) THEN [Date] 
    ELSE Convert(DateTime, NULL, 101) 
    END PERSISTED 
+0

不幸的是,我不能將兩個答覆都標記爲答案,所以我僅標記了第一個答案,並向上投票。謝謝! – 2010-08-30 00:57:02

相關問題