2010-10-21 5 views
1

Voici une table avec une colonne calculée dans SQL Server 2005:SQL Server: Calculés Erreur d'expression

CREATE TABLE footable AS 
    [identifier] nvarchar(255) NOT NULL, 
    [result]  AS CASE 
    WHEN [identifier] like '%\[%]' escape '\' 
    THEN LEFT([identifier], CHARINDEX('[',[identifier]) - 1) 
    END 

Voici ce que je me attends:

Cela a fonctionné il y a quelques jours, et travaille depuis plus d'un an.

Alors hier, j'ai commencé à obtenir cette erreur lors de l'insertion ou la mise à jour avec identifier valeurs qui avaient pas [, lorsqu'un NULL serait le résultat escompté:

Invalid length parameter passed to the left function. 

Maintenant, aujourd'hui, il travaille à nouveau.

Pourquoi SQL Server tente-t-il de résoudre la fonction LEFT() lorsque la valeur CASE est incorrecte? Plus important encore, pourquoi ça marche un jour et pas le prochain?

Je créais également des vues indexées hier, mais je ne couvrais aucune de ces colonnes. L'une des options SET nécessaires pour l'indexation d'une vue peut-elle provoquer le lancement d'erreurs de la base de données pour une expression comme celle-ci?

+0

Si vous obtenez les zones lors de l'insertion ou la mise à jour par opposition à la sélection, je soupçonne qu'ils doivent provenir d'ailleurs (par exemple, les déclencheurs). –

+0

"erreurs" pas "zones"! –

+0

Et si le premier caractère était un ['' pour un identifiant hier? Ensuite, vous demanderiez les 0 caractères de gauche. Peut-être que le modèle doit être '_% \ [%]' escape '\' – GilM

Répondre

0

J'utiliser

N'[^[]%\[%]' escape N'\' 

Cela devrait gérer la possibilité que le premier caractère est un [.

Ou, si vous voulez retourner un non-nul (chaîne vide?) Dans ce cas, utilisez un étui imbriqué pour gérer l'état de CHARINDEX retour 1.

Par ailleurs, vous n'êtes pas vraiment besoin de ce caractère d'échappement ou de la clause d'échappement. Vous pouvez utiliser [[] pour correspondre au caractère [:

N'[^[]%[[]%]' 

Mais, c'est une question de goût personnel. Je peux voir comment la version d'échappement est un peu plus claire