Это ужасно неприятно ... Я настоятельно рекомендую, чтобы, если вы хотите обрабатывать каждую адресную строку отдельно, вы должны хранить ее правильно в первую очередь. Вместо того чтобы продолжать делать то, что вы делаете, добавьте дополнительные столбцы, исправьте существующие данные один раз (вместо того, чтобы «исправлять» их каждый раз, когда вы выполняете запрос), а затем настройте хранимую процедуру, которая выполняет вставка / обновление, чтобы он мог использовать другие столбцы.
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;
Трюк Дениса PARSENAME (), конечно, намного сложнее, но вы должны быть чрезвычайно осторожны с использованием символа замены, который действительно невозможно естественным образом отобразить в данных. Карат (^), вероятно, хорошая ставка, но, как я уже сказал, вы должны быть осторожны.
Существуют также пакеты программ, которые действительно хороши для очистки адресов и других демографических данных. Но очистка ввода данных - это самая важная вещь, на которой я продолжу подчеркивать ... если каждую адресную строку нужно обрабатывать отдельно, сохраняйте их таким образом.