2009年12月19日土曜日

SQL CLRで、一時テーブルのデータをCSVファイルに出力する関数を作ってみます。





今回の記事では、SQL-Server 2008 の一時テーブルに格納されたデータを、CSVファイルに出力するSQL CLR関数を作ってみます。

SQL CLR関数に一時テーブルのデータを渡す方法ですが、パラメータによるデータの受け渡しは一切やりません。
パラメータで受け渡しをするのではなくて、関数の内部において、直接、一時テーブルにアクセスして読み取るようにします。

そう、ここが、SQL CLRならではの威力であり重要なポイントです。
通常のSQL-Server関数は、内部で一時テーブルの使用って不可能ですが、SQL CLRならば、それが可能なわけです。これはあまりにもデカイ。

一時テーブルを使うにあたり、SqlConnectionクラスの接続文字列に大きなポイントがあります。"context connection = true"と記述すると、関数を呼び出したSQL-Server 2008のセッションをそのまま引き継いでくれるため、一時テーブルが消滅する事なしに継続して利用出来てしまうわけです。

ちなみに、今回作る関数は、特に一時テーブルだけという制限を設けてはいないので、通常のテーブルも指定出来ます。

関数の内部では、読み取ったテーブルを、一旦DataTableクラスのオブジェクトに格納してから、好きな文字コードでもってCSVファイルに出力します。
テーブルのフィールド名は、そのままCSVのヘッダになります。

CSVを扱うと言えば、SQL-Serverには、標準でOpenRowSet()という非常に便利な関数が用意されていて、CSVファイルもコレで確かに扱えます。しかし、フォーマットやファイル名に制約があったり、64bitではそもそもCSVファイルを扱うプロバイダMicrosoft.JET.OLEDB.4.0がうまく動作しなかったり(現時点では)、色々とやっかいな点が山積みというのが現実です。

やっぱり、自作出来るというのは何よりも大きいです。
オートだと、想定外の不都合が発生した時に、最悪の場合はどうにも出来なくなって途方に暮れるという恐怖と隣り合わせですもんね。
自分で作った処理ならば、何とかなりそうという安心感があります。