6

Ich versuche, eine persistente berechnete Spalte CASE-Ausdruck zu erstellen:Warum ist mein CASE-Ausdruck nicht deterministisch?

ALTER TABLE dbo.Calendar ADD PreviousDate AS 
case WHEN [Date]>'20100101' THEN [Date] 
    ELSE NULL 
    END PERSISTED 

MSDN klar sagt, dass CASE deterministisch ist, here

Jedoch bin ich eine Fehlermeldung bekommen,:

Msg 4936, Level 16, State 1, Line 1 Computed column 'PreviousDate' in table 'Calendar' cannot be persisted because the column is non-deterministic.

Natürlich kann ich eine skalare UDF erstellen und sie explizit als deterministisch deklarieren, aber gibt es einen einfacheren Weg dazu? Ich bin bereits dabei, das neueste Service Pack zu bekommen. Vielen Dank.

+0

Alte Frage, ich weiß, aber wie schlagen Sie vor, * "erstellen eine skalare UDF und deklarieren sie explizit als deterministisch" * in SQL Server. Mir wurde gesagt, dass Sie dies in Oracle tun können, aber ich habe noch nie einen Weg in SQL Server gesehen ... – jimbobmcgee

Antwort

17

Sie müssen 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.

Also, versuchen Sie dies:

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

Datum Parsen von String kann unzuverlässig sein als I've answered before (mostly in comments)

Edit:

würde ich nicht sagen, es ist ein Fehler, aber SQL Server fragt nach 100% Klärung. yyyymmdd ist nicht ISO und SQL Server-Analyse JJJJ-MM-TT ist unzuverlässig (siehe meine Antwort Link)

+0

+1 - schlagen Sie mich dazu, agh! –

5

Offenbar ist es sehr wählerisch über Datentypen. Versuchen Sie, dies zu tun:

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

Leider kann ich nicht beide Antworten als Antworten markieren, also habe ich nur den ersten markiert und Ihren geupdated. Vielen Dank! –

Verwandte Themen