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 :

Concaténer résultat d'une sous requête


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 49
    Points : 30
    Points
    30
    Par défaut Concaténer résultat d'une sous requête
    Bonjour,

    J'utilise une vue sous SQL Server 2000.
    Je souhaite concaténer les résultats d'une sous-requête en une chaine de caractères dans l'une de mes colonnes. Est-ce réalisable ou dois je passer par une procédure stockée ?

    Merci d'avance pour votre aide.

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    On peut voir le code de la requête ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 49
    Points : 30
    Points
    30
    Par défaut
    Par exemple, j'ai une table X

    Table X (id, No, Description)
    =====================

    1, 000001, blabla1
    2, 000001, blabla2
    3, 000002, blabla3
    4, 000002, blabla4
    5, 000002, blabla5
    ...

    et à partir de ma vue, avoir en sortie :

    000001, blabla1 blabla2
    000002, blabla3 blabla4 blabla5
    ...

  4. #4
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    On peut éviter la procédure stockée ...
    ... mais pour mettre une fonction personnalisée à la place.

    Dans les deux cas (procédure ou fonction), comme le champ [Description] doit être concaténé en respectant un ordre précis,
    il me semble inévitable de passer par une programmation comportant un curseur.
    (La procédure stockée donnera de meilleures perfs).

    Dis-moi si tu veux un coup de main pour le code T-SQL.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juillet 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 49
    Points : 30
    Points
    30
    Par défaut
    Merci Népomucène
    A vrai dire, je veux bien un coup de main pour écrire cette fonction.
    Si tu peux m'expliquer la façon de procéder (aussi pour faire le lien avec ma vue). Un grand merci d'avance.

  6. #6
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonsoir,

    il me semble inévitable de passer par une programmation comportant un curseur.
    Il faudra en effet un traitement itératif mais il est possible d'éviter le curseur en le remplaçant par un WHILE par exemple.

    ++

  7. #7
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    La fonction :

    L'idée c'est que pour chaque [No] la fonction va retourner les descriptions concaténées (ligne par ligne donc)

    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].[Concat] (@No varchar(50))  -- on indique en paramètre le No sur lequel on veut concaténer la description
    RETURNS varchar(500) AS   -- déclaration du type de valeur retournée
    BEGIN 
        DECLARE @TexteConcat varchar(500), @Description varchar(50)  -- déclaration de variables utilitaires dans la fonction
        SET @TexteConcat = ''  -- initialisation
        DECLARE Cur CURSOR FOR 
            SELECT Description 
            FROM Table_X 
            WHERE No= @No ORDER BY Description 
        OPEN Cur
        FETCH NEXT FROM Cur INTO @Description
        WHILE @@FETCH_STATUS = 0 BEGIN
            SET @TexteConcat = @TexteConcat + @Description + ' '    -- cumul de  @Description dans @TexteConcat avec un espace pour faire joli
            FETCH NEXT FROM Cur INTO @Description   --  passage à l'enregistrement suivant
        END
        CLOSE Cur
        DEALLOCATE Cur
        RETURN @TexteConcat
    END
    Utilisation de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT No, dbo.concat(No) As DescriptionConcaténée FROM Table_X
    ne pas oublier la clause DISTINCT pour n'avoir que les [No] uniques

    Je trouve l'exécution assez longue.
    C'est valable pour un petit jeu d'enregistrements.
    Pour des milliers de lignes, j'utiliserai plutôt une procédure stockée avec table temporaire.

    @mikedavem
    il est possible d'éviter le curseur en le remplaçant par un WHILE
    Je suis preneur, peux-tu donner un exemple ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  8. #8
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    J'ai repris la fonction en supprimant le curseur et en le remplaçant par une simple variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE FUNCTION [dbo].[Concat] (@No varchar(50))  -- on indique en paramètre le No sur lequel on veut concaténer la description
    RETURNS varchar(500) AS   -- déclaration du type de valeur retournée
    BEGIN 
        DECLARE @TexteConcat varchar(500) -- déclaration de variables utilitaires dans la fonction
        SET @TexteConcat = ''  -- initialisation
     
        SELECT @TexteConcat = @TexteConcat + Description + ' ' 
        FROM TABLE_X
        WHERE No= @No ORDER BY Description 
     
        RETURN @TexteConcat
    END
    ++

  9. #9
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    Excellent ! et pourtant c'était évident quand on le voit
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  10. #10
    Nouveau membre du Club
    Inscrit en
    Juillet 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 49
    Points : 30
    Points
    30
    Par défaut
    Super !!
    C'est exactement ce que je recherchais.
    Merci infiniment à vous deux.

    ps : une très bonne initiation pour moi au T-SQL, encore merci

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

Discussions similaires

  1. Utiliser le résultat d'une sous-requête
    Par sam1212 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/10/2014, 18h29
  2. [AC-2010] Requête Update sur le résultat d'une sous-requête
    Par curt dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 06/07/2013, 21h40
  3. Utiliser les résultats d'une sous-requête
    Par BBric dans le forum Requêtes
    Réponses: 6
    Dernier message: 22/04/2011, 01h19
  4. Résultat requête lié à une sous requête
    Par BARKI dans le forum Langage SQL
    Réponses: 1
    Dernier message: 30/06/2006, 16h52
  5. Réponses: 3
    Dernier message: 18/05/2003, 00h16

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