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 テーブル 'Calendar' の計算列 '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 に答える