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 :

SQL Server, mise en ligne de plusieur données avec délimiteur


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 25
    Points : 43
    Points
    43
    Par défaut SQL Server, mise en ligne de plusieur données avec délimiteur
    Bonjour,

    Je cherche à mettre en une seule ligne plusieurs enregistrements, imaginons la table soft_doc_matrix suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    software_id              doc_id
    1                         001
    1                         002
    1                         003
    1                         004
    2                         005
    2                         006
    2                         007
    2                         008
    Je voudrais tout simplement afficher le résultat sous la forme suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    software_id           doc_id_concat
    1                   001,002,003,004
    2                   005,006,007,008
    Le code suivant me donne bien "001,002,003,004" ou "005,006,007,008" mais impossible de l'imbriquer dans une autre requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE @ChaineSortie         varchar(1000)
    SELECT @ChaineSortie = COALESCE(@ChaineSortie + ', ', '') + soft_doc_matrix.doc_id
           FROM soft_doc_matrix
    SELECT @ChaineSortie
    Comment je peux faire ?

    Ca ne me paraît pourtant pas si compliqué et pourtant ... j'ai lu sur d'autre discussions, qu'il faut utiliser des curseurs ... kesako ?

    Merci

  2. #2
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 75
    Points : 84
    Points
    84
    Par défaut
    Un curseur SQL représente une zone de mémoire de la base de données où la dernière instruction SQL est stockée.
    Ca n'est pas l'extase pour ce qui est des performances mais tu pourra faire ce que tu veux de manière plus procédurale puisque tu va parcourir tous les enregistrements correspondant au résultat de ta requète un à un.
    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
     
    DECLARE @doc_id numeric, 
    	@software_id numeric
     
    IF (CURSOR_STATUS('variable', 'CURSEUR_NEO') <> -3)
    BEGIN
    	CLOSE CURSEUR_NEO
    	DEALLOCATE CURSEUR_NEO
    END
     
    DECLARE CURSEUR_NEO CURSOR FOR
    	SELECT software_id, doc_id  FROM soft_doc_matrix
     
    OPEN CURSEUR_NEO
    FETCH NEXT FROM CURSEUR_NEO INTO 
    @doc_id, 
    @software_id 
     
    WHILE @@FETCH_STATUS=0
    BEGIN
     
    -- LA TU PEUX FAIRE TES TRAITEMENTS COMME TU LE SOUHAITES
     
    FETCH NEXT FROM CURSEUR_NEO INTO
    @doc_id, 
    @software_id 
     
    END
     
    CLOSE CURSEUR_NEO
    DEALLOCATE CURSEUR_NEO

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L9

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 25
    Points : 43
    Points
    43
    Par défaut
    A moins qu'il existe une forme plus élégante de remplacer la requête suivante (qui ne fonctionne pas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Document.*,
            Person.Name as Proprio,
            (SELECT STRING_JOIN(CAST(software_id as VARCHAR) FROM soft_doc_matrix WHERE soft_doc_matrix.doc_id = Document.doc_id)
    INNER JOIN Person ON Person.Id = Document.per_id_proprietaire
    Afin que je puisse avoir pour chaque document, la liste des logiciels qui permettent de l’ouvrir en une seule requête.

    Lla table document contient la liste des documents avec le nom de leurs propriétaires, et soft_doc_matrix la liste des logiciels que l'on peut utiliser pour tel ou tel document.

    Je n'étais pas assez précis dès le départ je pense.

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/03/2007, 16h05
  2. [SQL Server] mise à jour
    Par pinocchio dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/09/2006, 10h31
  3. Réponses: 3
    Dernier message: 06/09/2006, 09h01
  4. [SQL SERVER] Mettre à jour une base de donnée
    Par grellierj dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 24/05/2006, 11h33
  5. [Oracle/SQL-Server] Comment crypter une base de données ?
    Par [DreaMs] dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 28/11/2005, 18h02

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