begin process at 2010 03 16 13:04:00
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Trucs & Astuces

 > SQL SERVER – AGRÉGER DES CHAMPS VARCHAR

SQL SERVER – AGRÉGER DES CHAMPS VARCHAR




 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...


 Sources du même auteur

SQL SERVER : VÉRIFICATION DE L'ESPACE LIBRE SUR LE SERVEUR
SQL SERVER : CONVERSION IP EN CHAÎNE DE TEXTE VERS INTEGER E...
SQL SERVER 2005 : HISTORISER LES PROCÉDURES STOCKÉES D'UNE B...
SQL SERVER 2005 : RECHERCHE DE CHAMPS PAR LEURS NOMS MULTI B...
SQL SERVER 2005 : RÉCUPÉRER LE CONTENU D'UN SCHÉMA XSD

 Sources de la même categorie

Source avec Zip Source avec une capture SQL SERVER - GENERATION AUTOMATIQUE D'UNE RETRO-DOCUMENTATIO... par FENETRES
[SQL SERVEUR] VÉRIFIER L'ESPACE OCCUPÉ DANS UNE BASE DE DONN... par Hyperion
TROUVER LES PROCHAINS ANNIVERSAIRES par zefo
REQUÊTE SQL POUR DÉTERMINER L'ESPACE OCCUPÉ DANS LES TABLESP... par sgoriaud
SQL SERVER - OBTENIR LES VALEURS CORRESPONDANT A DES UNICODE par fabrice69

 Sources en rapport avec celle ci

SQL SERVER 2000 - VIDER ET COMPACTER TOUTES LES BASES DE DON... par fabrice69
SQL SERVER 2005 : HISTORISER LES PROCÉDURES STOCKÉES D'UNE B... par skweeky
SQL SERVER - OBTENIR LA POSITION DU PREMIER CHIFFRE D'UNE CH... par fabrice69
SQL SERVER 2005 : RECHERCHE DE CHAMPS PAR LEURS NOMS MULTI B... par skweeky
SQL SERVER - FONCTION QUI RENVOI LE SUFFIXE D'UNE CHAINE DE ... par fabrice69

Commentaires et avis

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.

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.

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


Discussions en rapport avec ce code source dans le forum

création d'une automatique d'une base de données SQLServer [ par MokhTelnet ] bonjourj'ai besoin de savoir comment on peut créer une base de données SQLServer lors de l'installation d'une application.mon client ne veux se charge Commande DOS pour SQLServer 7 [ par MokhTelnet ] y a t'il une commande dos pour SQLSERVER 7 ?(comme la commande sqlplus pour oracle) création automatique d'une base de données SQLServer [ par MokhTelnet ] bonjour j'ai besoin de savoir comment on peut créer une base de données SQLServer lors de l'installation d'une application. mon client ne veux se char Problème SQLSERVER/php [ par LeJulius ] Je travaille actuellement sous SQL SERVER 2000 en lien avec du PHP 4.2.0 Mon problème est le suivant :Mes tables sql contiennent des caractères accent Requete utilisant un IF (?) [ par Gamer_man ] Bonjour :)J'ai un petit probleme avec une requete...J'explique un peu :Sur mon site, il est possible de poster des commentaires en etant membre ou en aides requetes [ par thebadskull ] bonjour, j'ai des requetes SQL a faire dans le cadre d'un exercices, mais sur la 100aine que j'ai eu, je n'arrive pas du tout a en faire quelques unev convertir string en money [ par chris81 ] comment puis je faire pour convertir un string pour l'inserer dans mon champ de type moneymercihttp://www.correzeweb.comhttp://www.localetv.com convertion de date sous ms sql serveur et sp [ par jimmy69 ] Bonjour a tous , j'ai trouve ce code sur&nbsp; un forum qui fonctionne parfaitement ...et qui affiche donc la date au format Comparaison VARCHAR/TEXT [ par Athalus ] Bonjour,J'aurais voulu savoir s'il &#233;tait possible de comparer des variables de type VARCHAR et des variables de type TEXT dans une requ&#232;te ? Supprimer une date antérieure à une autre [ par billou_13 ] Bonjour, Alors, voila je dois faire une requ&#234;te SQL permettant de supprimer toutes les informations d'une table o&#249; les dates seraient ant&#


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,749 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales