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 :

Récuperer liste sans utiliser un curseur


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Points : 74
    Points
    74
    Par défaut Récuperer liste sans utiliser un curseur
    Bonjour:

    supposons avoir la table suivante:

    Nom Adresse
    Alain 1 Rue ...
    Aline 2 Rue ...
    Fabien 3 Rue ....


    besoin:

    Construire deux chaines de caractères:

    Chaine1 = 'Alain, Aline, Fabien'
    Chaine 2 = '1 Rue ...,2 Rue ...,3 Rue ...'


    Besoin: sans passer par un curseur

    Merci

  2. #2
    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,

    Une solution avec les CTE (Si vous êtes en sqlserver 2005).

    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
    45
     
    -- Création table de test
    CREATE TABLE dbo.nomAdresse
    (
    	Nom varchar(10) NOT NULL,
    	Adresse varchar(50) NOT NULL
    )
    GO
     
    -- Insertion des enregistrements
    INSERT INTO dbo.nomAdresse (Nom,Adresse) VALUES ('Alain','1 Rue ...');
    INSERT INTO dbo.nomAdresse (Nom,Adresse) VALUES ('Aline','2 Rue ...');
    INSERT INTO dbo.nomAdresse (Nom,Adresse) VALUES ('Fabien','1=3 Rue ...');
     
    -- Concaténation de chaînes à l'aide des CTE
    WITH tableEtPosition(position,nom,adresse)
    AS
    (
    	SELECT ROW_NUMBER() OVER(ORDER BY Nom,Adresse),Nom,Adresse
    	FROM dbo.nomAdresse
    )
    ,
    phrases (position,phrase,phraseAdresse)
    AS 
    (
    	SELECT position,CAST(nom AS VARCHAR(MAX)), CAST(Adresse AS VARCHAR(MAX))
    	FROM tableEtPosition
    	WHERE position = 1
    	UNION ALL
    	SELECT t.position,CAST(phrase + ',' + t.nom AS VARCHAR(MAX)), CAST(phraseAdresse + ',' + t.adresse AS VARCHAR(MAX))
    	FROM tableEtPosition t
    		INNER JOIN phrases p 
    			ON t.position = p.position + 1
    )
    ,
    maxphrase 
    AS
    (
    	SELECT MAX(position) AS maxposition
    	FROM phrases
    )
    SELECT p.phrase, p.phraseAdresse
    FROM phrases p
    	INNER JOIN maxphrase m
    		ON p.position = m.maxposition;
    Un très bon article sur les CTE. Je vous invite à le lire

    ++

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Vous pouvez aussi faire ceci, en reprenant la structure de données proposée par mikedavem :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE @chaine1 VARCHAR(MAX),
    		@chaine2 VARCHAR(MAX)
     
    SELECT @chaine1 = ISNULL(@chaine1, '') + nom + ', ',
    		@chaine2 = ISNULL(@chaine2, '') + adresse + ', '
    FROM dbo.nomAdresse
    @++ ;

  4. #4
    Membre régulier
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Vous pouvez aussi faire ceci, en reprenant la structure de données proposée par mikedavem :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE @chaine1 VARCHAR(MAX),
    		@chaine2 VARCHAR(MAX)
     
    SELECT @chaine1 = ISNULL(@chaine1, '') + nom + ', ',
    		@chaine2 = ISNULL(@chaine2, '') + adresse + ', '
    FROM dbo.nomAdresse
    @++ ;




    merci mikedavem
    merci elsuket


    cdt

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

Discussions similaires

  1. [XL-2010] Conditionner une liste de choix en fonction d'une autre sans utiliser la fonction INDIRECT
    Par rocofolie dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/11/2013, 12h54
  2. Utilisation du package listings sans droits admin
    Par Ornith dans le forum Mise en forme
    Réponses: 0
    Dernier message: 05/08/2013, 10h18
  3. Réponses: 14
    Dernier message: 26/04/2011, 18h00
  4. Réponses: 1
    Dernier message: 23/12/2010, 11h43
  5. Liste de noeuds sans utiliser XSLT, seulement XPATH
    Par Invité dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 10/01/2008, 09h53

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