Ceci est terriblement méchant ... Je recommande fortement que si vous voulez traiter chaque ligne d'adresse séparément, que vous stockez correctement en premier lieu. Au lieu de continuer à faire ce que vous faites, ajoutez les colonnes supplémentaires, corrigez les données existantes une fois (au lieu de "réparer" à chaque fois que vous exécutez une requête), puis ajustez la procédure stockée qui fait l'insertion/mise à jour afin qu'il sache utiliser les autres colonnes.
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() truc est beaucoup plus net bien sûr, mais vous devez être extrêmement prudent d'utiliser un caractère de remplacement qui est vraiment impossible d'apparaître dans les données naturellement. Le carat (^) est probablement un bon pari, mais comme je l'ai dit, vous devez faire attention.
Il existe également des progiciels qui sont très efficaces pour scruter l'adresse et d'autres données démographiques. Mais le nettoyage de l'entrée de données est la chose la plus importante ici que je vais continuer à souligner ... si chaque ligne d'adresse doit être traitée séparément, puis les stocker de cette façon.
Est-il possible que les données ne soient pas * stockées * dans une seule colonne? –
Toutes les lignes d'adresse sont stockées dans une seule colonne. – Jamie