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

Développement SQL Server Discussion :

Splitter une chaine et insertion dans une autre table


Sujet :

Développement SQL Server

  1. #1
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut Splitter une chaine et insertion dans une autre table
    Bonjour,
    J’insère le données suivant dans une table Log
    Nom : Main_Table.PNG
Affichages : 160
Taille : 4,4 Ko
    Après insertion dans la table, j'aimerais splitter les 3 autres colonnes afin d'obtenir ceci et de les inserer dans la table Detail_Log
    Nom : Detail_Table.PNG
Affichages : 160
Taille : 5,7 Ko
    Après recherche sur Internet, j'ai pu concocter la requête suivant qui permet de sortir les elements de la table Log suivant
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    WITH CTE AS (
         SELECT ID,
                split.a.value('.', 'NVARCHAR(MAX)') [Operations],
                ROW_NUMBER() OVER(ORDER BY ( SELECT 1)) RN
         FROM
         (
             SELECT ID,
                    CAST('<A>' + REPLACE(OperationList, ';', '</A><A>') + '</A>' AS XML) AS [Operations]
             FROM dbo.TLog
         ) a
         CROSS APPLY Operations.nodes('/A') AS split(a)),
         CTE1 AS (
         SELECT ID,
                split.a.value('.', 'NVARCHAR(MAX)') [Dates],
                ROW_NUMBER() OVER(ORDER BY ( SELECT 1 )) RN
         FROM
         (
             SELECT ID,
                    CAST('<A>' + REPLACE(DateList, ';', '</A><A>') + '</A>' AS XML) AS [Dates]
             FROM dbo.TLog
         ) aa
         CROSS APPLY Dates.nodes('/A') AS split(a)),
         CTE2 AS (
         SELECT ID,
                split.a.value('.', 'NVARCHAR(MAX)') [Amounts],
                ROW_NUMBER() OVER(ORDER BY ( SELECT 1 )) RN
         FROM
         (
             SELECT ID,
                    CAST('<A>' + REPLACE(AmountList, ';', '</A><A>') + '</A>' AS XML) AS [Amounts]
             FROM dbo.TLog
         ) aaa
     
         SELECT 
             C.ID
            ,LTRIM(RTRIM(C.Operations))
            ,LTRIM(RTRIM(C1.Dates))
            ,LTRIM(RTRIM(C1.Amounts))
         FROM CTE C
         JOIN CTE1 C1 ON C1.RN = C.RN
         JOIN CTE2 C2 ON C2.RN = C.RN
         WHERE C.Operations != '' AND C1.Dates != '' AND C2.Amounts != '';
    J'avoue ne pas trop connaitre les CTE ni non plus les XML, mais ca marche.
    J'aurais besoin d'aide pour insérer le résultat de la requête dans la table Detail_Log depuis un Trigger After Insert
    Merci d'avance.
    Andry
    On progresse .....

  2. #2
    Membre expérimenté Avatar de AaâÂäÄàAaâÂäÄàAaâÂäÄ
    Homme Profil pro
    db@
    Inscrit en
    Septembre 2021
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : db@

    Informations forums :
    Inscription : Septembre 2021
    Messages : 452
    Points : 1 300
    Points
    1 300
    Par défaut
    Quel modèle de données de m*rd*
    J'aurais fait qq chose dans ce goût là.
    Bon courage à toi.

  3. #3
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Citation Envoyé par AaâÂäÄàAaâÂäÄàAaâÂäÄ Voir le message
    Quel modèle de données de m*rd*
    J'aurais fait qq chose dans ce goût là.
    Bon courage à toi.
    He oui,
    Je n'ai aucun contrôle sur les données en amont, c'est pour ça que je dois le transformer pour traitement en aval.
    Merci pour l'encouragement.
    On progresse .....

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 109
    Points : 96
    Points
    96
    Par défaut
    C'est vrai que votre modèle n'est pas un cadeau.

    Sous quelle version sql vous etes??Une fonction table split existe à partir de 2016 je crois.

    Sinon, vous pouvez passer par une 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    ALTER FUNCTION [dbo].[FNTSplit] 
    (
    	@Chaine AS VARCHAR(MAX)
    	,@CaractereSeparation AS CHAR
    )
    RETURNS 
    @TabScan TABLE 
    (
    	  Resultat	VARCHAR(MAX)
    )
    AS
    BEGIN
    	DECLARE @Item VARCHAR(MAX)
    	,@NbItem INT
    	,@CompteurBoucle INT = 0
     
     
    	IF RIGHT(@Chaine, 1) <> @CaractereSeparation
    	BEGIN
    		SET @Chaine = @Chaine + @CaractereSeparation
    	END	
     
    	SET @NbItem = (LEN(@Chaine) - LEN(REPLACE(@Chaine, @CaractereSeparation, '')))
    	WHILE @CompteurBoucle < @NbItem
    	BEGIN
     
    		SET @Item = SUBSTRING(@Chaine, 0, CHARINDEX(@CaractereSeparation, @Chaine))
    		SET @Chaine = REPLACE( @Chaine, @Item + @CaractereSeparation, '') 
     
     
     
    		INSERT INTO @TabScan (Resultat)
    			SELECT
    			@Item
     
    		SET @CompteurBoucle = @CompteurBoucle + 1
    	END
     
     
    	-- Insertion dans la table temporaire de retour.
     
     
    	RETURN
    END
    Exemple d'usage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT * FROM [FNTSplit] ('C6L60,E1A,2DX', ',')

  5. #5
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Citation Envoyé par KyoshiroKensei Voir le message
    C'est vrai que votre modèle n'est pas un cadeau.
    Sous quelle version sql vous etes??Une fonction table split existe à partir de 2016 je crois.
    Bonjour,
    C'est SQL Server 2016. Exactement, il y a une fonction split, mais vu que je dois aligner les résultats du split sur les 3 chaines, le code que j'ai exposé ci-dessus le fait très bien.
    Le souci maintenant c'est comment insérer le résultat de mon moulin dans une table Log_Detail après l'insertion dans le table Log depuis un trigger after insert.
    Voilà.
    On progresse .....

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 109
    Points : 96
    Points
    96
    Par défaut
    POur l'insert du résultat de la CTE, il suffit de faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ;WITH CTE_Test as (
    select 1 as colonne1
     
    ) insert into [dbo].[test] (test) select * from CTE_Test

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/10/2008, 15h31
  2. insertion dans une table puis update dans une autre table
    Par uptoditime dans le forum VBA Access
    Réponses: 5
    Dernier message: 10/10/2007, 18h08
  3. Réponses: 2
    Dernier message: 05/06/2006, 14h24
  4. Réponses: 4
    Dernier message: 03/06/2006, 12h45
  5. [ODBC] Récupération d'une donnée pour insertion dans une autre table
    Par rom950 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/03/2006, 17h13

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