2016-07-26 11 views
0

Ich arbeite derzeit an einem Projekt, in dem der Client ein einzelnes Feld haben muss, in diesem Fall ein Stadtstaat und Zip-Feld in 3 separate Felder in einer Ansicht aufgeteilt. Ich habe Code gefunden, der das gut macht, aber das Problem, auf das ich gestoßen bin, ist, dass der Stadtstatus und die Zip-Daten nicht immer in derselben Spalte sind. Manchmal befindet es sich in der Spalte shp_to_addr_2 und manchmal in der Spalte shp_to_addr_3.Parsing Adressdaten, die nicht in einer Spalte sein können

Der Code führt zu einem Parameterfehler, weil er manchmal mit einem Nullwert endet. Ich habe versucht, eine Variable zu verwenden, um die Spalte mit den Daten darin zu fangen, aber am Ende mit diesem lästigen Fehler. Hier ist der Code, den ich als gespeicherte Prozedur eingerichtet habe, mit der Fehlermeldung. Was mache ich falsch?

USE [database] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [dbo].[USER_SP_VI_USER_UPS_TRACK_2] 

@address VARCHAR(50) = NULL 

AS 
SET NOCOUNT ON 

BEGIN 
    UPDATE VI_USER_UPS_TRACK_2 
    SET @address = shp_to_addr_3 

    IF @address IS NULL 
    SELECT ord_no, cust_no, ord_dat, shp_to_nam, shp_to_addr_1, shp_to_addr_2, shp_to_addr_3, ord_typ, 
    (LEFT(shp_to_addr_2, CHARINDEX(',', shp_to_addr_2) - 1)) AS City, LEFT(LTRIM(SUBSTRING(shp_to_addr_2, 
    CHARINDEX(',', shp_to_addr_2) + 1, 4)), 2) AS ST, RIGHT(RTRIM(shp_to_addr_2), CHARINDEX(' ', REVERSE 
    (RTRIM(shp_to_addr_2))) - 1) AS Zip 
    FROM VI_USER_UPS_TRACK_2 

    ELSE IF @address IS NOT NULL 

    SELECT ord_no, cust_no, ord_dat, shp_to_nam, shp_to_addr_1, shp_to_addr_2, shp_to_addr_3, ord_typ, 
    (LEFT(shp_to_addr_3, CHARINDEX(',', shp_to_addr_3) - 1)) AS City, LEFT(LTRIM(SUBSTRING(shp_to_addr_3, 
    CHARINDEX(',', shp_to_addr_3) + 1, 4)), 2) AS ST, RIGHT(RTRIM(shp_to_addr_3), CHARINDEX(' ', REVERSE 
    (RTRIM(shp_to_addr_3))) - 1) AS Zip 
    FROM VI_USER_UPS_TRACK_2 
END 

Das Verfahren erstellt, aber wenn ich diese bekommen ausgeführt:

Msg 537, Ebene 16, Status 2 Prozedur USER_SP_VI_USER_UPS_TRACK_2, Zeile 13 Ungültige Längenparameter nach links oder SUBSTRING-Funktion übergeben.

+1

müssen Sie Ihren Code debuggen.Verstarten Sie, um zu verstehen, welche Parameter links/Right, Teilzeichenfolge takes.Then überprüfen Sie Ihren Code, um zu sehen, wenn Sie einen ungültigen Parameter übergeben, ist es schwer für uns zu debuggen, da es keine gibt Aktuelle Daten zum Testen – TheGameiswar

+0

Ich würde empfehlen, 'select' anstelle von' update' zu ​​verwenden, wenn Daten in Variablen importiert werden. Die Verwendung von update führt zu mehr Verwirrung, da Sie die Tabelle nicht aktualisieren. –

+0

Dieser View-Code funktioniert, wenn Daten in shp_to_addr_3, aber wenn in der anderen Spalte shp_to_addr_2, es Fehler. SELECT ord_no, CUST_NO, ord_dat, shp_to_nam, shp_to_addr_1, shp_to_addr_2, shp_to_addr_3, ord_typ, (LEFT (shp_to_addr_3, CHARINDEX ('', shp_to_addr_3) - 1)) AS City, LEFT (LTRIM (SUBSTRING (shp_to_addr_3, CHARINDEX (' ' shp_to_addr_3) + 1, 4)), 2), wie ST, rechts (RTRIM (shp_to_addr_3), CHARINDEX ('', REVERSE (RTRIM (shp_to_addr_3))) - 1) als Zip FROM VI_USER_UPS_TRACK_2 –

Antwort

0

Sie holen nur die letzte Zeile, die aus der Tabelle VI_USER_UPS_TRACK_2 in die Variable @address und basierend auf kommen passiert, dass Sie zu anderem Weg gehen. Ich würde annehmen, dass es viel mehr Zeilen in Ihrem Tisch gibt, also funktioniert Ihre Logik überhaupt nicht.

Sie müssen eine case-Anweisung schreiben, die die einzelnen Zeilen, die Sie bearbeiten, überprüft und die darauf basierenden Daten verwendet.

Außerdem ist @address der Eingabeparameter der Prozedur, aber Sie überschreiben den Wert zu Beginn der Prozedur.

+0

I habe versucht, dies in der ursprünglichen Ansicht Code zu tun, habe ich die gleiche Fehlermeldung. Beispiel hier: –

+0

Wo ist das Beispiel? Der Code, den Sie in den Kommentaren in der Frage gepostet haben, ist völlig falsch. Sie benötigen eine Case-Anweisung, um zu entscheiden, aus welchem ​​Adressfeld die Daten stammen sollen. –

+0

Vielen Dank für Ihre Eingabe. Ich lerne immer noch die fortgeschrittene Seite von T-SQL, und mein Kollege, der ein bisschen mehr Erfahrung hat als ich, hat die Aussicht, mit dem Case Select zu arbeiten. Ich weiß nicht, warum das Beispiel, das ich eingefügt habe, nicht aufgetaucht ist. Ich werde den Arbeitscode in der Option "Antworten" veröffentlichen, falls jemand anders an einem ähnlichen Projekt arbeiten muss. –