Dies ist furchtbar böse umgekehrt ... ich empfehle, dass, wenn Sie möchten, jede Adressleitung separat behandeln, dass Sie es richtig lagern in den ersten Platz. Anstatt das zu tun, was Sie tun, fügen Sie die zusätzlichen Spalten hinzu, beheben Sie die vorhandenen Daten einmal (anstatt es jedes Mal zu reparieren, wenn Sie eine Abfrage ausführen), und passen Sie dann die gespeicherte Prozedur an, die die Einfügung/Aktualisierung vornimmt damit es die anderen Spalten benutzt.
DECLARE @Address TABLE(id INT IDENTITY(1,1), ad VARCHAR(MAX));
INSERT @Address(ad) SELECT 'line 1
line 2
line 3
line 4'
UNION ALL SELECT 'row 1
row 2
row 3'
UNION ALL SELECT 'address 1
address 2'
UNION ALL SELECT 'only 1 entry here'
UNION ALL SELECT 'let us try 5 lines
line 2
line 3
line 4
line 5';
SELECT
id,
Line1 = REPLACE(REPLACE(COALESCE(Line1, ''), CHAR(10), ''), CHAR(13), ''),
Line2 = REPLACE(REPLACE(COALESCE(Line2, ''), CHAR(10), ''), CHAR(13), ''),
Line3 = REPLACE(REPLACE(COALESCE(SUBSTRING(Rest, 1, COALESCE(NULLIF(CHARINDEX(CHAR(10), Rest), 0), LEN(Rest))), ''), CHAR(10), ''), CHAR(13), ''),
Line4 = REPLACE(REPLACE(COALESCE(SUBSTRING(Rest, NULLIF(CHARINDEX(CHAR(10), Rest) + 1, 1), LEN(Rest)), ''), CHAR(10), ''), CHAR(13), '')
FROM
(
SELECT
id,
ad,
Line1,
Line2 = SUBSTRING(Rest, 1, COALESCE(NULLIF(CHARINDEX(CHAR(10), Rest), 0), LEN(Rest))),
Rest = SUBSTRING(Rest, NULLIF(CHARINDEX(CHAR(10), Rest) + 1, 1), LEN(Rest))
FROM
(
SELECT
id,
ad,
Line1 = SUBSTRING(ad, 1, COALESCE(NULLIF(CHARINDEX(CHAR(10), ad), 0), LEN(ad))),
Rest = SUBSTRING(ad, NULLIF(CHARINDEX(CHAR(10), ad) + 1, 1), LEN(ad))
FROM
@address
) AS x
) AS y
ORDER BY id;
Denis' ParseName() Trick ist viel aufgeräumter natürlich, aber man muss sehr vorsichtig sein, über ein Ersatzzeichen verwenden, das wirklich unmöglich ist natürlich in den Daten angezeigt werden. Das Karat (^) ist wahrscheinlich eine gute Wette, aber wie gesagt, du musst vorsichtig sein.
Es gibt auch Software-Pakete, die wirklich gut sind, Adresse und andere demographische Daten zu schrubben. Aber das Bereinigen der Dateneingabe ist hier das Wichtigste, das ich weiter betonen werde ... wenn jede Adresszeile separat behandelt werden soll, dann speichern Sie sie auf diese Weise.
Können die Daten * nicht * in einer einzigen Spalte gespeichert werden? –
Alle Adresszeilen sind in einer einzigen Spalte gespeichert. – Jamie