Esto es muy desagradable ... os recomiendo que si quieres tratar a cada línea de dirección por separado, que se almacenan correctamente en el primer lugar. En lugar de seguir haciendo lo que está haciendo, agregue las columnas adicionales, corrija los datos existentes una vez (en lugar de "solucionarlos" cada vez que ejecute una consulta), y luego ajuste el procedimiento almacenado que realiza la inserción/actualización para que sepa usar las otras columnas.
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() truco Denis' es mucho más ordenado, por supuesto, pero hay que tener mucho cuidado con el uso de un carácter de reemplazo que es realmente imposible de aparecer en los datos de forma natural. El quilate (^) es probablemente una buena apuesta, pero como dije, debes tener cuidado.
También hay paquetes de software que son realmente buenos para depurar direcciones y otros datos demográficos. Pero limpiar la entrada de datos es lo más importante que voy a seguir insistiendo ... si cada línea de direcciones debe tratarse por separado, entonces guárdelas de esa manera.
¿Hay alguna posibilidad de que los datos * no * estén almacenados en una sola columna? –
Todas las líneas de direcciones se almacenan en una sola columna. – Jamie