2016-09-18 1 views
0

Ich weiß, dass es ähnliche Fragen gibt, aber keine davon ist genau das, was ich brauche. Ich habe einen SQL-Sproc, dass ein Teil davon eine Ansicht ausführt. Ich habe 3 Datenbanken, die in Design und Funktion identisch sind, aber die Daten sind unterschiedlich und ich bekomme diesen Fehler nur bei einem von ihnen. Wenn ich die Ansicht von der fehlerhaften DB nehme und sie auf einer der anderen ausführe, läuft es gut. Der seltsamste Teil ist, dass diese Ansicht funktioniert hat, dann gestoppt wurde, sich dann selbst repariert hat und wieder angefangen hat zu arbeiten und als ich begann, Änderungen an einigen Daten vorzunehmen, hörte es wieder auf.Ungültiger Längenparameter an die LINKS- oder SUBSTRING-Funktion übergeben 4

Ich habe es auf diese spezifische Linie heruntergekocht;

Left(AO.Name,PATINDEX('%-%',AO.Name)-1) as ColumnName 

Der interessante Teil ist, wenn ich '%-% ändern '%' der Fehler geht weg und meine SPROC korrekt ausgeführt werden.

Ich habe fünf Fragen;

  1. , warum ich immer diese Fehlermeldung, wenn ich die '%-%' aber nicht '%' haben? Was ist der Unterschied und welche Art von Veränderung wird gemacht, wenn man einen gegen den anderen benutzt?

  2. Was bedeutet dieser Fehler?

  3. Warum sollte dieselbe Ansicht auf zwei anderen identischen Datenbanken richtig funktionieren, aber nicht auf dieser?

  4. Warum hörte das auf zu arbeiten, nachdem es funktioniert hat, dann irgendwie sich selbst reparieren und dann sich selbst wieder brechen nach etwas Datenmanipulation?

  5. Gibt es eine bessere Methode außerhalb von PATINDEX, die ich verwenden könnte?

Jede Hilfe wird geschätzt. Vielen Dank.

+0

ich die SQL Server-Tag hinzugefügt, weil 'PATINDEX()' SQL Server schlägt. –

Antwort

0

Dies wird passieren, wenn in der Zeichenfolge kein Bindestrich vorhanden ist.

Erstens können Sie PATINDEX() mit CHARINDEX() in diesem Fall ersetzen:

LEFT(AO.Name, CHARINDEX('-', AO.Name) - 1) as ColumnName 

Das ist nicht das Problem nicht beheben, aber es ist einfacher zu folgen.

Dann ist das Problem, dass AO.Name keinen Bindestrich hat. In diesem Fall gibt PATINDEX() (und CHARINDEX() auch) 0 zurück. Sie subtrahieren 1 und der Wert ist als zweites Argument zu LEFT() ungültig.

Die einfachste Lösung ist ein Bindestrich am Ende zu setzen:

LEFT(AO.Name, CHARINDEX('-', AO.Name + '-') - 1) as ColumnName 
+0

Bis jetzt scheint dies zu beheben. Ich habe den Fehler nicht gesehen, seit ich ihn geändert habe. Ich werde die Änderungen an den anderen beiden DBs vornehmen und sehen, was ich bekomme. – inFAM1S

Verwandte Themen