2009-06-10 7 views
1

Dans un projet utilisant une base de données MSSQL 2005, nous devons consigner toutes les actions de manipulation de données dans une table de consignation. Un champ de cette table est censé contenir la ligne avant qu'elle ne soit modifiée. Nous avons beaucoup de tables alors j'essayais d'écrire une procédure stockée qui rassemblerait tous les champs dans une rangée d'une table qui lui a été donnée, les concaténerait d'une façon ou d'une autre et écrirait alors une nouvelle entrée de journal avec cette information.Concaténation de lignes de différentes tables dans un même champ

J'ai déjà essayé d'utiliser FOR XML PATH et cela a fonctionné, mais le client n'aime pas la notation XML, ils veulent un champ csv.

Voici ce que j'avais avec FOR XML PATH:

DECLARE @foo varchar(max); 
SET @foo = (SELECT * FROM table WHERE id = 5775 FOR XML PATH('')); 

Les valeurs de "table", "id" et l'identifiant réel (ici: 5775) plus tard être transmis via l'appel au stocké procédure.

Y at-il un moyen de le faire sans obtenir la notation XML et sans savoir à l'avance quels champs vont être retournés par l'instruction SELECT?

Répondre

0

Nous avons utilisé le chemin XML et comme vous l'avez découvert, cela fonctionne très bien. Puisque l'une des fonctionnalités de SQL est de stocker du XML correctement, le CSV n'a aucun sens.

Ce que vous pouvez essayer est un proc stocké qui lit le format XML au format CSV (faux). Je voudrais. Étant donné que vous ne lirez probablement pas autant les données que si vous les enregistrez, les frais généraux sont négligeables.

0

Que diriez-vous:

Set @Foo = Stuff(
         (Select ',' + MyCol1 + ',' + MyCol2 ... 
          From Table 
          Where Id = 5775 
          For Xml Path('') 
         ), 1, 1, '') 

Cela produira une ligne CSV (en supposant le SQL interne retourne une seule ligne). Maintenant, cela résout la deuxième partie de votre question. En ce qui concerne la première partie de "sans savoir à l'avance quels champs", il n'y a aucun moyen de le faire sans utiliser le SQL dynamique. Par exemple, vous devez générer l'instruction SQL en tant que chaîne à la volée. Si vous allez faire cela, vous pouvez aussi bien construire tout le résultat CSV à la volée.

Questions connexes