split un champ de ma table dans un select
Bonjour à tous,
J'ai une table sql qui contient 2 champs :
ID int
ADRESSE varchar(MAX)
le champ ADRESSE contient des adresses mails séparées par des ; (en nombre variable et de longueur variable)
Je cherche désespérément à faire une requête qui m'extrait les adresses mails exploitables :
exemple de contenu de ma table :
1 toto@yahoo.fr;titi@gmail.fr;tata@yahoo.fr
2 tutu@gmail.fr;toto@yahoo.fr
...
résultat escompté :
1 toto@yahoo.fr
1 titi@gmail.fr
1 tata@yahoo.fr
2 tutu@gmail.fr
2 toto@yahoo.fr
j'ai bien trouvé sur le net un exemple de fonction qui split un champ mais je n'arrive à le faire fonctionner que sur une ligne de la manière suivante :
Code:
1 2
| declare @des varchar(max) = (SELECT top 1 [ADRESSE] FROM matable)
SELECT * FROM fctSplitToChar(@des, ';') |
la fonction :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| ALTER FUNCTION [fctSplitToChar](
@DelimitedText VARCHAR(MAX), -- liste CSV
@QuoteChar CHAR(1) -- caractère de délimitation
) RETURNS @Items TABLE (Item VARCHAR(MAX))
BEGIN
DECLARE @Item VARCHAR(MAX)
WHILE CHARINDEX(@QuoteChar, @DelimitedText, 0) <> 0 BEGIN
SELECT @Item=SUBSTRING(@DelimitedText,1,CHARINDEX(@QuoteChar,@DelimitedText, 0)-1),
@DelimitedText=SUBSTRING(@DelimitedText,CHARINDEX(@QuoteChar,@DelimitedText, 0) + LEN(@QuoteChar), LEN(@DelimitedText))
IF LEN(RTRIM(@Item)) > 0
INSERT INTO @Items SELECT CONVERT(VARCHAR, @Item)
END
-- Dernier item de la liste
IF LEN(RTRIM(@DelimitedText)) > 0
INSERT INTO @Items SELECT CONVERT(VARCHAR, @DelimitedText)
RETURN
END |
impossible de la faire fonctionner dans une requête sur l'ensemble des lignes de ma table, j'ai essayé la manière suivante :
Code:
1 2 3
| SELECT a.ID, b.Item
FROM matable a
CROSS APPLY fctSplitToChar(a.ADRESSE, ';') AS b |
mais ça me renvoie une erreur Syntaxe incorrecte vers '.'.
Merci d'avance de vos réponses.