Version 2010.2.x ~
  任意のSQL文の実行結果をそのままCSVファイルに出力することはできますか?

システムユーティリティクラスを利用したプログラムを作成することで実現できます。

【注意1】出力データの区切り文字がカンマではなくタブで出力されます点、ご注意ください。
【注意2】エクセルでタブ区切りのファイルを開くため、エクセルの開くメニューから出力したファイルを開いてください。

処理概要は以下の通りです。

1) %SYSTEM.SQL クラス(※)の Execute() メソッドを使用します。

 第1引数:SQL文を指定します。
 第2引数:内部日付が格納されている場合 yyyy-mm-dd で出力されるように表示モードを切り替えます。(1:odbcモード)
 引数詳細は下記ドキュメントページをご参照ください。
 $SYSTEM.SQL.Execute()について

※ %SYSTEMパッケージ以下クラスは $system 特殊変数を利用してメソッドを実行できます。

set rset=$system.SQL.Execute("ここにSQL文",1)


2) 実行結果は %SQL.StatementResult クラスのインスタンスで返ります。
%DisplayFormatted() メソッドを使用して検索結果のファイル出力を実行します。

// 第1引数:出力形式の指定
//  0:XMLファイル出力
//  1:HTMLファイル出力
//  99:タブ区切りのテキストファイル出力)
// 100:CSVファイル出力《注意:タブ区切りで生成されます》 【注意3】参照
// 第2引数:出力ファイル名の指定(ファイルの拡張子を付けずにフルパスで指定)
//    【注意】Caché/Ensembleサーバ上に出力されます
// 第3引数:実行結果の取得用変数(参照渡しのため、先頭にピリオド付与)
do rset.%DisplayFormatted(99,"c:\kit\test",.pMessages)


上記処理をまとめてストアドプロシージャとして利用できるサンプルクラスを添付しています。
検索対象テーブルが存在するネームスペースにインポートしてご利用ください。
 
サンプル実行例は以下の通りです。(SAMPLESネームスペースの Sample.Person テーブルに対する実行例)

call ISJSQL.Utils_ToCSV('select ID,Name,DOB,Home_City from Sample.Person Where ID<20',99,'c:\kit')

 

USER>zn "samples"? // ターミナルでクラスメソッドとしての実行例

SAMPLES>set sql="select ID,Name,DOB,Home_City from Sample.Person Where ID<20"

SAMPLES>set st=##class(ISJSQL.Utils).ToCSV(sql,99,"c:\kit")

SAMPLES>write st? // 1が返れば処理成功です。
1


引数詳細はサンプル内の説明文をご参照ください。

【注意3】%DisplayFormatted() メソッドの第1引数に100を指定するとCSVファイルが出力されますが、タブ区切りで生成されます。エクセルで、生成されたCSVファイルを開くためには、一旦拡張子を txt に変更した後、エクセルの開くメニューからファイルを開いてください。


関連トピック:
添付ファイル: 参考資料(zip)

アンケートにご協力をお願いします
このトピックは参考になりましたか?
このトピックに関するお問い合わせ

FAQトップに戻る