Utilisation de T-SQL REPLACE avec search générique pour replace les valeurs de champ

J'ai une table avec un schéma:

CREATE TABLE InvestorDetails ( [ID] INT PRIMARY KEY, [Created] DATETIME, [Updated] DATETIME, [ToEmail] VARCHAR(MAX) ) 

Les loggings dans InvestorDetails ressemblent à ceci:

 1, 2017-01-01, 2017-02-02, [email protected];[email protected];[email protected];[email protected] 2, 2017,01-02, 2017-02-02, [email protected];[email protected];[email protected] 3, 2017-02-02, 2017,02-03, [email protected];[email protected];[email protected];[email protected];[email protected] 

Je veux écrire une requête qui va passer et mettre à jour chaque logging dans la table qui a '[email protected]' dans le champ 'ToEmail' avec '[email protected]'

Donc, par exemple dans l'logging 1 ci-dessus, je veux que cela ressemble à:

 1, 2017-01-01, 2017-02-02, [email protected];[email protected];[email protected];[email protected] 

Je peux find les loggings avec [email protected] dans 'EmailRecipients' en utilisant la requête suivante:

 SELECT I.ID, I.EmailRecipients FROM InvestorDetails I WHERE I.EmailRecipients LIKE '%[email protected]%' 

La partie délicate consiste à s'assurer que seul le [email protected] est changé, et le rest rest. Je crois que ceci peut être réalisé avec TSQL REPLACE, mais j'ai du mal à écrire le SQL, en particulier ce qu'il faut utiliser comme parameters ssortingng_pattern et ssortingng_replacement.

Toute aide est grandement appréciée!

Merci!

Vous pouvez utiliser la requête suivante

 UPDATE InvestorDetails SET EmailRecipients = REPLACE(';' + EmailRecipients + ';', ';[email protected];' , ';[email protected];' ) WHERE EmailRecipients LIKE '%;[email protected];%' 

Ceci est fait pour s'assurer que les mails qui contiennent des marques telles que [email protected] ne sont pas mis à jour.

Si vous souhaitez supprimer les points-virgules ajoutés et inférieurs ajoutés, vous pouvez utiliser la requête suivante

Vous pouvez utiliser la requête suivante

 UPDATE InvestorDetails SET EmailRecipients = SUBSTRING(REPLACE(';' + EmailRecipients + ';', ';[email protected];' , ';[email protected];'),2, LEN( REPLACE(';' + EmailRecipients + ';', ';[email protected];' , ';[email protected];' ) - 2 ) WHERE EmailRecipients LIKE '%;[email protected];%' AND ISNULL(EmailRecipients,'') <> '' 

Une autre requête a été fournie par @MartinSmith dans les commentaires

 UPDATE InvestorDetails SET ToEmail = SUBSTRING(replaced, 2, LEN(replaced) -2) FROM InvestorDetails CROSS APPLY (SELECT REPLACE(';'+ ToEmail + ';',';[email protected];' , ';[email protected];')) CA(replaced) WHERE ToEmail LIKE '%[email protected]%'