2016-07-13 8 views
2

Ich habe eine Abfrage wie diese (SQL-Server):Tsql Vermeiden Sie Fehler in where-Klausel

UPDATE TableX set FieldB = 'SomeValue' 
where 
FieldA is not null and FieldC is not NULL and FieldB is null and FieldD > 0 and 
substring(FieldA,5, CHARINDEX('/', FieldA, 5) - 5) in ('ValueA','ValueB') 

Das Problem ist, dass manchmal FieldA null ist und diese Abfrage fehlschlägt auf dem ersten Auftreten von null auf FieldA, I don Ich will das nicht.

Die Fehlermeldung lautet:

Invalid length parameter passed to the LEFT or SUBSTRING function.

Und es verursacht durch FieldA null zu sein.

Bitte helfen.

+0

http://stackoverflow.com/questions/17368062/invalid-length-parameter-passed-to-the-left-or-substring-function – MusicLovingIndianGirl

+0

@MusicLovingIndianGirl diese Lösung über eine select-Klausel ist keine where-Klausel – Fourat

+0

@ jean könntest du und beispiel liefern ?? – Fourat

Antwort

2

Ich würde diese Endklausel in Klammern umschließen und für den Wert NULL zulassen, etwas in der Art;

UPDATE TableX 
set FieldB = 'SomeValue' 
where 
FieldA is not null 
and FieldC is not NULL 
and FieldB is null 
and FieldD > 0 
and 
(
substring(FieldA,5, CHARINDEX('/', FieldA, 5) - 5) in ('ValueA','ValueB') 
OR 
FieldA IS NULL 
) 

Wenn Sie immer noch Probleme mit NULL mit dann kann es sein, dass Ihre CHARINDEX möglicherweise eine negative Zahl zurückgeben kann (wenn es nicht ein ‚/‘ in Ihren Daten nicht finden). Geben Sie einige Beispieldaten an und Sie erhalten zusätzliche Antworten. Versuchen Sie die folgende Abfrage, die die ABS() Funktion verwendet;

UPDATE TableX 
set FieldB = 'SomeValue' 
where 
FieldA is not null 
and FieldC is not NULL 
and FieldB is null 
and FieldD > 0 
and 
(
substring(FieldA,5, ABS(CHARINDEX('/', ISNULL(FieldA,''), 5) - 5)) in ('ValueA','ValueB') 
OR 
FieldA IS NULL 
) 
+1

Ihre Lösung löst noch den Fehler aus, da es den Fall nicht behandelt, wenn FieldA ist null in der Teilstringfunktion. – Fourat

+0

Versuchen Sie den zweiten mit dem ISNULL, den ich gerade hinzugefügt habe. Beispieldaten würden ermöglichen, dass dies richtig getestet wird. Wenn Sie immer noch ein Problem haben, fügen Sie bitte Beispieldaten zu Ihrer Frage hinzu. –

+0

'SELECT substring (FeldA, 5, ABS (CHARINDEX ('/', ISNULL (FeldA, ''), 5) - 5)) FROM TABLEX' funktioniert gut, also denke ich, es ist eine Lösung !! Danke – Fourat

2

Eine Option wäre FieldA im Falle einer Dummy-Folge zu verschmelzen, dass es NULL sein:

UPDATE TableX 
SET FieldB = 'SomeValue' 
WHERE FieldA IS NOT NULL AND 
     FieldC IS NOT NULL AND 
     FieldB IS NULL AND 
     FieldD > 0 AND 
     SUBSTRING(COALESCE(FieldA, '   /'), 
       5, 
       CHARINDEX('/', COALESCE(FieldA, '   /'), 5) - 5) 
      IN ('ValueA','ValueB') 

Die Dummy-Folge I verwendet wird, zehn Räume, die durch einen Schrägstrich gefolgt, dh __________/

Jetzt, wenn FieldANULL sein, wird entweder die IS NULL Prüfung zuerst getroffen oder die Teilstringbedingung wird zuerst getroffen. In beiden Fällen würde die WHERE Prüfung für NULLFieldA fehlschlagen.

+0

Ich mag das, aber es löst immer noch den Fehler: Ungültige Länge Parameter an die LINKE oder SUBSTRING-Funktion übergeben. – Fourat

+0

Sind Sie sicher, dass Sie meine Suchanfrage genau kopiert haben? –

+0

Ja habe ich !!!!! – Fourat