SQL Server: remplacez le courrier électronique par un exemple de text mais maintenez la structure

Pour une instance SQL Server 2005, quel est le meilleur moyen de find / replace une colonne avec plusieurs courriels comme

<[email protected]>; [email protected]; [email protected] ..... 

et le replace par

 <[email protected]>; [email protected]; [email protected] ..... 

À des fins de test, je pourrais penser à quelques façons de le faire en C # mais je me demandais s'il y avait un moyen de le faire dans SQL Server, peut-être avec REGEX? Je veux garder le plus possible l'étrangeté random (certains courriels ont des parenthèses, d'autres ont des points-virgules à la fin, etc …)

Merci

Ici vous allez, vous pouvez l'accomplir avec un cte dans une fonction.

 create function dbo.FixupEmails(@s varchar(8000)) returns table as return ( WITH splitter_cte AS ( SELECT CHARINDEX(';', @s) as pos, 0 as lastPos, 1 as cte_level UNION ALL SELECT CHARINDEX(';', @s, pos + 1), pos, cte_level + 1 as cte_level FROM splitter_cte WHERE pos > 0 ), each_email_cte AS( select replace(replace(replace(OneEmail, '>', ''), '<', ''), ' ', '') as OneEmail, cte_level from (select SUBSTRING(@s, lastPos + 1, case when pos = 0 then 80000 else pos - lastPos -1 end) as OneEmail, cte_level from splitter_cte) as t ), each_half_cte AS ( select OneEmail, CHARINDEX('@', OneEmail) as atPos, cte_level from each_email_cte where len(OneEmail) > 6 -- 6 from [email protected] (I think that 6 would be the minimum valid email length) ), new_email_cte as ( select cte1.OneEmail, Replace(@s, cte1.OneEmail, '[email protected]') as New, cte1.cte_level --, 1 as level from each_half_cte cte1 where cte1.cte_level = 1 UNION ALL select cte2.OneEmail, Replace(necte.New, cte2.OneEmail, '[email protected]') as New, cte2.cte_level--, 1 as level from new_email_cte as necte inner join each_half_cte as cte2 on cte2.cte_level = necte.cte_level + 1 ) select New from new_email_cte where cte_level = (select max(cte_level) from new_email_cte) ) go set nocount on; declare @emailSsortingng varchar(2048) set @emailSsortingng = '<[email protected]>; [email protected]; [email protected] '; select @emailSsortingng as Original; SELECT * FROM dbo.FixupEmails(@emailSsortingng); set @emailSsortingng = '<[email protected]>; [email protected];'; select @emailSsortingng as Original; SELECT * FROM dbo.FixupEmails(@emailSsortingng); set @emailSsortingng = '<[email protected]>'; select @emailSsortingng as Original; SELECT * FROM dbo.FixupEmails(@emailSsortingng) OPTION(MAXRECURSION 0); -- include MAXRECURSION as shown above if you have more than 100 email addresses in the field. set @emailSsortingng = '<[email protected]>; [email protected];'; select @emailSsortingng as Original; SELECT * FROM dbo.FixupEmails(@emailSsortingng) 

C'est assez long, mais voici la sortie.

 Original ---------------------------------------------------------------- <[email protected]>; [email protected]; [email protected] New ----------------------------------------------------------------- <[email protected]>; [email protected]; [email protected] Original ---------------------------------------------------------------- <[email protected]>; [email protected]; New ---------------------------------------------------------------- <[email protected]>; [email protected]; Original ---------------------------------------------------------------- <[email protected]> New ---------------------------------------------------------------- <[email protected]> Original ---------------------------------------------------------------- <[email protected]>; [email protected]; New ---------------------------------------------------------------- <[email protected]>; [email protected]; 

C'était très amusant. Je pense que la fonction fournie fera ce que vous cherchez.

Quelques suggestions:

  • Fonctions de string SQL Server

    Une approche pourrait être:

    1. Trouver l'index d'un symbole @
    2. Remplacez la partie avant (jusqu'à l'espace précédent ou autre caractère – peut-être l'set [],; <> ()) avec votre ID d'email
    3. Remplacer la partie après (jusqu'à l'espace ou le caractère suivant) avec votre domaine
    4. Répétez avec le symbole @ suivant dans la colonne

    S'il vous arrive de replace une partie d'un nom convivial et non un identifiant d'email par accident, cela ne devrait pas être important.

    Utilisez CHARINDEX pour find l'index suivant du symbole @ dans une string. Utilisez PATINDEX pour find l'index d'un motif particulier, par exemple un espace ou d'autres caractères séparateurs. Il peut être plus facile de découper la string par section ou de la split sur des espaces blancs que de traiter la totalité de la chose à la fois.

  • Il peut également être plus facile d'écrire une regex et de configurer une fonction SQL CLR pour effectuer le rlocation.

  • Si la raison du rlocation des adresses e-mail est d'éviter de leur envoyer des e-mails, vous pouvez définir un indicateur / une option de debugging dans l'application. Lorsque l'indicateur est défini, remplacez une adresse e-mail par une adresse ou un journal défini par le développeur, mais ignorez l'envoi de l'e-mail.