IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

besoin d'aide pour fonction split


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2006
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 96
    Points : 88
    Points
    88
    Par défaut besoin d'aide pour fonction split
    Bonjour

    J'ai récupéré sur le net une fonction SQL qui permet de faire un split d'une chaine de caractère et de renvoyer une table d'entier (la chaine doit être composé de nombres séparés par n'importe quel caractère)
    Voici la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ALTER FUNCTION [dbo].[SPLIT_ICSV]( 
        @CSV_TEXT VARCHAR(MAX),  -- liste CSV
        @SEP CHAR(1)            -- caractère de délimitation
    ) RETURNS @Items TABLE (Item INTEGER)
     
    BEGIN
       DECLARE @Item VARCHAR(11)
       WHILE CHARINDEX(@SEP, @CSV_TEXT, 0) <> 0 BEGIN
            SELECT @Item=SUBSTRING(@CSV_TEXT,1,CHARINDEX(@SEP,@CSV_TEXT, 0)-1), 
                   @CSV_TEXT=SUBSTRING(@CSV_TEXT,CHARINDEX(@SEP,@CSV_TEXT, 0) + LEN(@SEP), LEN(@CSV_TEXT))
            IF LEN(RTRIM(@Item)) > 0
                INSERT INTO @Items SELECT CONVERT(INTEGER, @Item)
       END
       -- Dernier item de la liste
       IF LEN(RTRIM(@CSV_TEXT)) > 0
           INSERT INTO @Items SELECT CONVERT(INTEGER, @CSV_TEXT)
       RETURN
    END
    Et voici comment je la teste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ALTER PROCEDURE [dbo].[SPLIT_TEST]
    AS
    BEGIN
     
    	SELECT Item FROM dbo.SPLIT_ICSV('1 2 3 4', ' ')
     
    	IF @@ERROR <> 0
    	BEGIN
    	    RETURN 0
    	END
    	ELSE
    	BEGIN
    		RETURN 1
    	END
    END
    La boucle WHILE doit être infinie car la fonction arrive au timeout et ne renvoie rien.

    Quelqu'un à une idée ?
    Merci

  2. #2
    Membre régulier
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2006
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 96
    Points : 88
    Points
    88
    Par défaut
    Bonjour

    J'ai réecrit la fonction moi-même. Maintenant ça marche.
    Je ne sais pas exactement ce qui n'allait pas.

    Voici la version qui fonctionne (elle est à mon avis un peu plus performante également car on met la position en mémoire au lieu de rappeler plusieurs fois CHARINDEX avec les mêmes arguments) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    ALTER FUNCTION [dbo].[SPLIT_ICSV]( 
        @CsvText varchar(50),   -- liste CSV
        @Sep CHAR(1)            -- caractère de délimitation
    ) RETURNS @Items TABLE (Item int)
     
    BEGIN
    	DECLARE @I varchar(11)
    	DECLARE @Pos int
     
    	SET @Pos = CHARINDEX (@Sep, @CsvText)
     
    	While @Pos <> 0 BEGIN
    		SET @I = SUBSTRING(@CsvText, 0, @Pos)
    		SET @CsvText = SUBSTRING(@CsvText, @Pos+1, LEN(@CsvText))
    		SET @Pos = CHARINDEX (@Sep, @CsvText)
    		If LEN(RTRIM(@I)) > 0 BEGIN
    			INSERT INTO @Items SELECT CONVERT(int, @I)
    		END
    	END
     
    	IF LEN(RTRIM(@CsvText)) > 0 BEGIN
    		INSERT INTO @Items SELECT CONVERT(int, @CsvText)
    	END
     
       RETURN
    END
    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin d'aide pour fonction
    Par jbertin9 dans le forum Excel
    Réponses: 5
    Dernier message: 04/02/2009, 11h14
  2. besoin d'aide pour fonction et redirection
    Par roilion dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/09/2008, 10h29
  3. besoin d'aide pour fonction de conversion de base
    Par babou54 dans le forum Delphi
    Réponses: 12
    Dernier message: 13/01/2007, 21h06
  4. [Mail] besoin d'aide pour la fonction mail
    Par laymounos dans le forum Langage
    Réponses: 5
    Dernier message: 07/06/2006, 21h16
  5. Besoin d'aide pour fonctions OpenSSL..... HELP !!!
    Par aide64 dans le forum Langage
    Réponses: 7
    Dernier message: 12/05/2006, 17h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo