- - PR -
出力データの編集方法(SQLserver DTS)
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-08-25 12:11
お疲れさまです。
いつもお世話になっております。 SQL-Server2000のDTSを利用して、CSVを出力するのですが、 出力データを列に展開したいです。 元のデータは「学生」「科目」「成績」になっています。 これを「学生」「科目1」「科目2」・・・「総合成績」 に変換して出力したいです。 ここで、問題になっているのが「科目」数が変動することです。 構想としては、 1)出力形式のワークテーブルを作成 2)ワークテーブルに成績を更新 3)CSVデータの出力 4)ワークテーブルの削除 なのですが、1の「CREATE TABLE」がうまくいきません。 この命令文に変数(@b)は利用できないのでしょうか? 良い方法があればご助言下さい。 宜しくお願い致します。 | ||||
|
投稿日時: 2005-08-25 13:10
お疲れ様です。 CREATE TABLE の問題は,DTS ではないですね。 これは, CREATE TABLE に関連する全ての命令文を DECLARE @CMD NVARCHAR(2000) などとしたコマンドを組み立てる変数に一度整形して, それを sp_executesql や EXEC に渡せば実現できます。 コマンドの組み立ての際に 変数を使用しますね。 ---------- TimberLandChapel http://blogs.timberlandchapel.com/blogs/timberlandchapel/ | ||||
|
投稿日時: 2005-08-26 11:04
お疲れさまです。
毎回、大変勉強させて頂いております。 今回の問題も無事解決することができ、 なおかつ、変数の利用が自由に出来るようになりました。 これで、横編集のテーブルもワークを作る方法で データが作成できそうです。 ありがとうございました。 | ||||
|
投稿日時: 2005-10-14 19:35
いつもお世話になっております。
お疲れ様です。 元のスレッドの続きなのですが、ワークテーブルは毎回 項目数が変更しても作成することが出来るようになったのですが、 出力するCSVデータの項目数をワークテーブルに合せて うまく変更することが出来ません。 恐らく変換元と変換先のリンクが変更できていないと思われます。 出力する項目数や項目名などは動的プロパティを利用して変更することが 出来ました。 具体的には、デザインで作成した時は3項目でしたが、項目数を増やして 実行すると4項目目からは初期値(数値は0)がセットされてしまいます。 変更前:[学生][国語の点][理科の点] 変更後:[学生][国語の点][理科の点][算数の点] の算数の点が出力して欲しいのですが、「0」がセットされてしまいます。 テーブルにはもちろんデータがセットされています。 どうしたら良いのか、良い案をご提供ください。 よろしくお願いします。 | ||||
|
投稿日時: 2005-10-15 13:44
おつかれさまです。 項目数や項目名の変更は, 出力先 CSV ファイルの 「OLE DB 接続」プロパティにある,「ColumnNames」や「Number of Column」で設定されましたでしょうか? 他の方法で設定されていたら,具体的にどう設定したかを教えてください。 さて, DTS の変換元と変換先を動的に変更しても, 実際にデータを流し込む「パイプ」は「データ変換タスク」の「Copy Column」変換に定義されています。 パイプを変更するためには,この定義自体を変更してあげなければならないのですが, 残念ながら,動的プロパティタスクではこの定義の必要な部分を書き換えられません。 (パイプで変更できるのは,定義済みの項目の列順程度です) そこで,代替案なのですが, 確か kama さんのシナリオは 点数を横展開した CSV データを出力する だったと思います。 そこでまずは,横展開したワークテーブルを作成しました。 ここまできていれば,「そのとき必要になっている項目の列名と数」は確定していますから, ちょっと力技になってしまいますが, DTS のソースを SQL 文で指定して,加工済みの出力列にしてしまってはいかがでしょう ・ワークテーブル ID | 点数1 | 点数2 1 | 100 | 100 2 | 90 | 90 3 | 10 | 10 ・DTS ソース SELECT 選択と文字列連結を使用して出力列を事前に加工してしまう OUTPUT(nvarchar(255)) | 1,100,100 2,90,90 3,10,10 こうしておけば, 変換タスクのパイプは常に単一の OUTPUT 列から OUTPUT 列を指定しておくだけで,変更の必要はありません。 いかがでしょうか? 本来どおり,ワークテーブルのデータを素直に CSV 出力するとすると, bcp を使うか, ActiveX スクリプトによる複雑な変換を定義しなければならないと思います。 ---------- TimberLandChapel Workshop 開催 → http://blogs.timberlandchapel.com/blogs/workshop/archive/2005/10/01/438.aspx [ メッセージ編集済み 編集者: TLC 編集日時 2005-10-15 13:46 ] | ||||
|
投稿日時: 2005-10-18 19:39
お疲れ様です。
いつもお世話になっております。 TLCさんのおっしゃる通り、 「OLE DB 接続」プロパティに項目数や項目名は設定しました。 やはり、項目は変更できても変換定義は変えれないのですね。 (残念です) ご提案いただいた、『力技』にチャレンジしたいのですが、 具体的にはDTS内でどの項目を利用してどのように記述したらよろしいのでしょうか? いろいろやってみてはいるのですが、どうも私の領域を越えているようで・・・ ご迷惑を掛けついでに教えていただけませんでしょうか。 「DTSのソースをSQL文で指定して・・・」のところがチンプンカンプンで・・・ よろしくお願いします。 | ||||
|
投稿日時: 2005-10-18 21:18
お疲れ様です。 ご提案しました力技は データ変換タスクの変換元をちょっと加工した SQL クエリにします。 SELECT CONVERT(nvarchar(50),[ID]) + ',' + CONVERT(nvarchar(50),[value]) FROM [TBL] などとすれば,CSV 形式に無理やり加工した単一列が DTS の変換元になります。 この形に加工する クエリ文字列を DTS_DataSource に動的に割り当ててあげれば, あとは単一列からテキストファイルに出力するパイプを毎回使用することができます。 ---------- TimberLandChapel Workshop 開催 → http://blogs.timberlandchapel.com/blogs/workshop/archive/2005/10/01/438.aspx [ メッセージ編集済み 編集者: TLC 編集日時 2005-10-18 21:31 ] | ||||
|
投稿日時: 2005-10-31 12:03
お疲れ様です。
ご提案頂いた「力技」クリアできました。 「SQL実行タスク」と「グローバル変数」と「動的プロパティ」を駆使しました。 当初、DTSでは出来あがらないかと思っていましたが、いろいろご尽力頂いたおかげで、 無事出来あがりました。 ありがとうございました。 またさらに勉強させてください。 今後とも、よろしくお願い致します。 |