6

Je suis en train de créer une colonne calculée persistante en utilisant l'expression CASE:Pourquoi mon expression CASE est-elle non déterministe?

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

MSDN dit clairement que CAS est déterministe, here

Cependant, je reçois une erreur:

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

Bien sûr, je peux créer une fonction UDF scalaire et la déclarer explicitement comme déterministe, mais existe-t-il un moyen plus simple de contourner ce problème? Je suis déjà en train d'obtenir le dernier service pack. Merci.

+0

Ancienne question, je sais, mais comment proposez-vous de * "créer un UDF scalaire et le déclarer explicitement comme déterministe" * dans SQL Server. On me dit que vous pouvez le faire dans Oracle, mais je n'ai jamais vu un moyen dans SQL Server ... – jimbobmcgee

Répondre

17

Vous devez 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.

Alors, essayez ceci:

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

Date de l'analyse syntaxique de la chaîne peut être peu fiable I've answered before (mostly in comments)

Edit:

Je ne voudrais pas disons que c'est un bug, mais SQL Server demande une clarification à 100%. yyyymmdd n'est pas ISO et SQL Server analyse yyyy-mm-dd n'est pas fiable (voir mon lien de réponse)

+0

+1 - me battre, agh! –

5

Apparemment, il est très pointilleux sur les types de données. Essayez de faire ceci:

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

Malheureusement je ne peux pas marquer les deux réponses comme des réponses, donc je n'ai marqué que le premier, et j'ai augmenté le vôtre. Merci! –

Questions connexes