begin process at 2008 08 29 01:26:17
1 233 465 membres
8 nouveaux aujourd'hui
14 291 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SQL SERVER – AGRÉGER DES CHAMPS VARCHAR


Information sur la source



Description

Comment à partir d'une table comme celle-ci :

Champ
-----
A
B
C
D
E

faire pour récuprer une chaîne de caractères de ce type :

"A, B, C, D, E"

Et bien voici les solutions.

La première fonctionne sur toutes les éditions de SQL Server 7 à 2005.
La seconde fonctionne sur toutes les éditions de SQL Server 2005 uniquement (Express incluse).

Source

  • -- Création de la table
  • IF OBJECT_ID('MaTable') IS NULL
  • CREATE TABLE MaTable (Champ varchar(10))
  • GO
  • -- Remplissage
  • INSERT INTO MaTable (Champ) VALUES ('A')
  • INSERT INTO MaTable (Champ) VALUES ('B')
  • INSERT INTO MaTable (Champ) VALUES ('C')
  • INSERT INTO MaTable (Champ) VALUES ('D')
  • INSERT INTO MaTable (Champ) VALUES ('E')
  • INSERT INTO MaTable (Champ) VALUES ('F')
  • INSERT INTO MaTable (Champ) VALUES ('G')
  • INSERT INTO MaTable (Champ) VALUES ('H')
  • -- 1ère méthode avec SQL Server 7, 2000 et 2005
  • DECLARE @machaine varchar(200)
  • SET @machaine = ''
  • SELECT @machaine = @machaine + Champ + ',' FROM MaTable
  • SELECT @machaine
  • -- 2ème méthode avec SQL Server 2005 uniquement
  • SELECT champ + ',' as 'text()'
  • FROM MaTable
  • FOR XML PATH('')
  • -- Supprime la table de travail
  • DROP TABLE MaTable
  • GO
-- Création de la table
IF OBJECT_ID('MaTable') IS NULL
  CREATE TABLE MaTable (Champ varchar(10))
GO

-- Remplissage
INSERT INTO MaTable (Champ) VALUES ('A')
INSERT INTO MaTable (Champ) VALUES ('B')
INSERT INTO MaTable (Champ) VALUES ('C')
INSERT INTO MaTable (Champ) VALUES ('D')
INSERT INTO MaTable (Champ) VALUES ('E')
INSERT INTO MaTable (Champ) VALUES ('F')
INSERT INTO MaTable (Champ) VALUES ('G')
INSERT INTO MaTable (Champ) VALUES ('H')

-- 1ère méthode avec SQL Server 7, 2000 et 2005
DECLARE @machaine varchar(200)

SET @machaine = ''

SELECT @machaine = @machaine + Champ + ',' FROM MaTable

SELECT @machaine

-- 2ème méthode avec SQL Server 2005 uniquement

SELECT champ + ',' as 'text()'
FROM MaTable
FOR XML PATH('')

-- Supprime la table de travail
DROP TABLE MaTable
GO

Conclusion

Il existe une 3ème méthode consistant à créer une fonction d'agrégat définie par l'utilisateur avec .net via Visual Studio (avec votre langage préféré).

A préciser vous ne pourrez pas utiliser ces 2 méthode avec GROUP BY. Seule la solution de développer une fonction en .net le pourrait, elle ne fonctionnera que sur SQL Server 2005.

Bon testS...
  • signaler à un administrateur
    Commentaire de Malkuth le 29/09/2006 15:56:47

    hello

    J' ai essayer la méthode 1 sous 2005 :
    SET @machaine = ''
    SELECT @machaine = @machaine + Champ + ',' FROM MaTable
    SELECT @machaine

    Ca marche trés bien mais ...

    Ben aprés N caractéres il n'écrit plus rien dans la chaine pourtant j'ai essayer de convertir tous en nvarchar(Max) mais pas moyen
    (je voulais tester pour faire des CSV).

    Je vais tenter la méthode avec XMLPath. mais je voudrais bien savoir d'ou viens le problème si tu en as une idée.

  • signaler à un administrateur
    Commentaire de skweeky le 14/04/2007 21:13:48 administrateur CS

    En fait c'est qu'il n'affiche pas les chaînes au de là d'une certaine longueur (configurable) dans Management Studio çà m'a déjà fait le coup plusieurs fois.

  • signaler à un administrateur
    Commentaire de ankou22 le 30/09/2007 15:24:25

    Bonjour et un grand merci pour cette exemple qui m'a donné un début de solution.

    J'ai une table 'Table1' et une table Table2. Table2 contient plusieurs ligne de Message pour un idTable1.

    Je souhaite obtenir une concatenation de la colonne Message Groupée par idTable1.
    J'ai réussit avec cette requête :

    IF OBJECT_ID('MaTableTemp') IS NULL
    CREATE TABLE MaTableTemp
    (idTb1 varchar(20),message varchar(8000))

    DECLARE @idTable1 VARCHAR(50)

    DECLARE curseur_idTable1 CURSOR FOR
    SELECT distinct idTable1 FROM Table1 where idTable1 <>''

    OPEN curseur_idTable1

    FETCH curseur_idTable1 INTO @idTable1

    WHILE @@FETCH_STATUS = 0
    BEGIN
    --Concatenation des messages
    DECLARE @machaine varchar(200)
    SET @machaine = ''
    SELECT @machaine = @machaine + message + char(13) FROM Table2 WHERE idTb1=@idTable1
    --Insertion d un enregistrement dans ma table
    INSERT INTO MaTableTemp(idTb1,message)
    SELECT @idTable1,@machaine

    --PRINT @idTable1
    --PRINT @machaine

    FETCH curseur_idTable1 INTO @idTable1
    END

    CLOSE curseur_idTable1
    DEALLOCATE curseur_idTable1

    SELECT * FROM MaTableTemp

    DROP TABLE MaTableTemp


    En résumé :
    je créer une table temporaire 'MaTableTemp'
    je déclare un curseur curseur_idTable1 qui contient ma requête principale
    Je fais une boucle, et pour chaque résultat, j'exécute la concatenation que j'insère dans 'MaTableTemp'
    Enfin je fais un select * de ma table 'MaTableTemp'
    avant de la supprimer

    Si vous avez mieux, je suis preneur

Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS