2009-06-10 13 views
1

MSSQL 2005データベースを使用するプロジェクトでは、アクションを操作するすべてのデータをロギングテーブルに記録する必要があります。そのテーブルの1つのフィールドには、変更前の行が含まれています。私はテーブルがたくさんあるので、与えられたテーブルのある行のすべてのフィールドを集めて何らかの形で連結し、その情報で新しいログエントリを作成するストアドプロシージャを作成しようとしました。異なるテーブルの行を1つのフィールドに連結する

私は既にFOR XML PATHを使用して試してみましたが、うまくいきましたが、クライアントはXML表記が気に入らず、CSVフィールドが必要です。

は、ここで私はXMLパスにしていたものです:

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

「テーブル」、「ID」の値と(ここでは:5775)は、実際のidは、後で保存への呼び出しを通じて渡されます手順。

XML記法を使用せずに、そしてSELECTステートメントによって返されるフィールドが事前に分からなければ、これを行う方法はありますか?

答えて

0

私たちはXMLパスを使用しています。あなたが発見したように、これは非常にうまく動作します。 SQLの機能の1つはXMLを適切に保存することなので、CSVは意味をなさない。

試してみることができるのは、XMLをCSV形式(偽物)で読み込むストアドプロシージャです。私は...するだろう。あなたはそれを保存するのに比べてそれほど多くのデータを読んでいる可能性は低いので、オーバーヘッドはごくわずかです。

0

方法について:

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

これは(内部SQLを想定すると、単一の行を返す)CSVラインを生成します。今、これはあなたの質問の第二の部分を解決します。 「どのフィールドを事前に知らなくても」の最初の部分については、動的SQLを使用せずにこれを行う方法はありません。つまり、SQL文をその場で文字列として構築する必要があります。もしあなたがそれをやろうとしているのであれば、その場でCSVの結果全体を構築するかもしれません。

関連する問題