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

MS SQL Server Discussion :

function split ?


Sujet :

MS SQL Server

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    433
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 433
    Par défaut function split ?
    salut,

    j'ai une table "table1" qui contient une cle a une chiane de caractere
    exe (id,lib)=>(1,'1,2')
    je veux creer une 2 eme table avec un auatnt de , que de champ lib

    exemple
    table1(1,'1,2')
    table2(1,'1','2')
    voila pour realiser ça? j'ai essayé ça mais ça marche.
    j'ai tjrs la meme valeur dans lib1 et lib2
    je sais pas comment incrementer d'une maniere dynamique l'indice de depart

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select
    IDENTITY(INT,1,1) AS ID
    ,substring ([chaine],1,charindex(',',[chaine])-1) as [lib1]
    ,substring ([chaine],1,charindex(',',[chaine])-1) as [lib2]
    into [dbo].[table2]
    from [dbo].[table1]
    des idées???

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Est-ce le nombre d’élément du champ lib, de la table table1, est le même quelle que soit la ligne ou il peut varier d’une ligne à l’autre. Autrement dit est-ce que peut avoir ceci dans table1
    Table1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Id lib 
    11,2,321,2,3,431,2,3,4,5
    Au quel cas, Tu ne peux pas connaitre à l’avance le nombre de colonnes de la table2 (sauf à définir un nombre de colonne max ?)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    433
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 433
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Id lib 
    11,2,321,2,3,431,2,3,4,5

    oui on peut avoir ce cas qui se transforme à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Id lib lib1  lib2  lib3 lib4
    11' '2'    '321' '2'    '3'    '431' '2'    '3'    '4'  '5'

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    1 - OK, mais comme la table table2 sera créée une seule fois (?), il faudra toute fois préciser le nombre de colonnes maximum. Bon, ce n'est pas le problème. Ce nombre peut être calculé, à un instant ‘t’, en fonction des données de la table table1. sachant qu’une table (SQL server 2005 et supérieur) peut contenir jusqu’à 1024 colonnes.

    2 - Ci-dessous une fonction SPLIT qui pourra te servir pour décomposer les éléments du champ table1.lib

    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
    CREATE FUNCTION dbo.FC_U_SPLIT( 
       @pi_List VARCHAR(8000),           
       @pi_Delimiter VARCHAR(8000) = ',' 
       )
       RETURNS @List TABLE (Item VARCHAR(8000))
       BEGIN
        DECLARE @sItem VARCHAR(8000)
    	WHILE CHARINDEX(@pi_Delimiter,@pi_List,0) <> 0 
    	BEGIN 
    	   SET @sItem = RTRIM(LTRIM(SUBSTRING(@pi_List,1,CHARINDEX(@pi_Delimiter,@pi_List,0)-1)));  
    	   SET @pi_List = RTRIM(LTRIM(SUBSTRING(@pi_List,CHARINDEX(@pi_Delimiter,@pi_List,0)+LEN(@pi_Delimiter),LEN(@pi_List)))); 
    	   IF LEN(@sItem) > 0  
    	      INSERT INTO @List (Item) VALUES (@sItem);   
    	END; 
    	IF LEN(@pi_List) > 0 
    	   INSERT INTO @List (Item) VALUES (@pi_List);  
    	RETURN; 
    END
    GO
    La fonction ci-dessus, de type table, FC_U_SPLIT combinée à la fonction ROW_NUMBER te permettra de numéroter les lignes,
    Exemple
    Supposons que Table1.lib contient la valeur chaine '1,2,3,4,5'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ROW_NUMBER() OVER(ORDER BY item ASC) AS RowNumber, Item 
    FROM dbo.FC_U_SPLIT('1,2,3,4,5',',')
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    RowNumber	Item
    1	1
    2	2
    3	3
    4	4
    5	5
    Ces numéros de lignes (colonne RowNumer) correspondront, lors de l’insertion, au numéro de colonnes dans la table table2 (c’est comme si tu fais une rotation de 90° du résultat de la fonction FC_U_SPLIT)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Table2 
    … lib1  lib2, lib3, lib4, lib5
    ..  1	2	3   4	5
    Voilà le travail est un peu mâché, maintenant je te laisse mettre tout ça au propre et finir le boulot !

    A+

  5. #5
    Invité
    Invité(e)
    Par défaut
    Entre nous, bonjour la galère pour gérer une table pareille...
    Il serait plus propre d'insérer une ligne par couple.

    Pour (1,'1,2') et (3,'2,5') :
    tu aurais dans la table de destination, les couples :
    (1,1)
    (1,2)
    (3,2)
    (3,5)

    Ça serait bien plus facile de faire des requêtes la-dedans que sur toutes les colonnes d'une table telle que défini auparavant.

    Après, libre à toi de te compliquer la vie...

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    1 -
    Il serait plus propre d'insérer une ligne par couple
    Personnellement je suis entièrement d’accord avec toi. En plus ce serait dans la logique du modèle relationnel, En effet, on doit toujours résonner en terme de tuples (ie des enregistrements lignes) et non pas sur des colonnes. En plus la table table2 serait plus facile à utiliser dans des opérations de jointure etc..
    Maintenant, personnellement je n’ai pas tous les éléments pour apporter un jugement sur le MCD. Il y a peut être une raison pour ce choix (?) .

    2 - Je ne l’ai pas précisé dans mon poste précédent, mais il faudra vraisemblablement recourir au SQL dynamique EXECUTE sp_executesql pour construire dynamiquement les requêtes INSERT sur la table table2

Discussions similaires

  1. Split function ?
    Par khaled84 dans le forum Oracle
    Réponses: 3
    Dernier message: 01/11/2010, 19h56
  2. split - function avec image
    Par mimagyc dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 13/05/2008, 22h35
  3. split en xsl
    Par alexandre54 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/03/2003, 10h08
  4. [postgreSQL] équivalent de la function 'instr'
    Par Dra_Gun dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2003, 16h09
  5. [Dev c++ 4] implicite declaration of function "int kbhi
    Par Torpedox dans le forum Dev-C++
    Réponses: 5
    Dernier message: 01/01/2003, 13h37

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