【SSIS】SSIS覚書-接続マネージャー関連

記事のフォーマットを他とあわせるついでに全体的に加筆・修正しました。

[2014/06/30追記ここまで]

SSIS覚書シリーズ一覧

前書き

SSISは日本語のノウハウがまとまってないし、バッドノウハウだらけだし、MSDNはいつものようにクソなので、ちまちまと書き出して行こうと思う。

と言うわけでとりあえず接続マネージャー関連から。

知っておくべきこと

接続マネージャーと言うかSSIS全体の基本思想として、ここで読み書きするデータに異常など存在しないと決め付ける節があるので、桁数がおかしかったり、型が誤っているとどの項目までは教えてくれるんですが、行数などは出してくれません。

細かいログを出すことは基本的にできません。自分でスクリプトタスク / スクリプトコンポーネントで実装する必要があります。

また、動的に接続文字列を指定したい場合は「プロパティ→Expressions→ConnectionString」から設定可能です。自力でConnectionStringを書く必要があるので、適当に接続マネージャーを作って参考にしてみるといいです。

その他にもdtexecのオプションから動的にConnectionStringを変更することもできます。

dtexec /CONNECTION "[接続マネージャ名];[ConnectionString]"

他にも構成ファイルを使用する方法もあります。(個人的には使いにくいのでオススメしない。)詳しくはドキュメントをどうぞ。

接続マネージャーの一覧

Integration Services (SSIS) の接続と言うドキュメントにSSISで使用できる接続マネージャーの一覧が載っています。

私が使ったことがあるのはこのあたり。

色々あるけど、普通に業務で使うなら下三つだけ覚えておけば案外どうにかなります。

と言うか、今見て知ったけどWMI 接続マネージャーなんてあるのか。

キャッシュ接続マネージャー

参照変換で取得するキャッシュを先に取得してしまっておけばお得やん?ぐらいの発想で作られました。

まぁあんまり使うことはないんですが、巨大なテーブルに対しコストの高いクエリを何度も発行するぐらいなら絶対に使ったほうが良いし、大量に参照を使うパッケージだとメモリ不足でエラーを吐いて落ちることもあるので、その対処として使用するのもアリだと思います。

取得後のキャッシュに追加でインデックスを付与することもできます。

フラット ファイル接続マネージャー

デフォルトで設定される型のDT_STRはvarcharと同義と考えて良いです。全角文字なら2バイト、半角なら1バイト。

nvarcharだったりUnicodeだったりする場合はDT_WSTRにする必要があります。Unicodeにチェックを入れておくとデフォルトがDT_WSTRになってくれます。

型を設定しておくと読み込み時/書き出し時に変換したり型チェックしてくれたりします。って言うかその型じゃないとマッピングできなくなるってだけですが。

列名はファイル参照時にヘッダがあれば自動でつけてくれます。実際はヘッダがない場合でも、接続マネージャーを作る段階では一旦つけておかないと保守する時誰かが死ぬ、って言うか死んだことがあるので、つけておきましょう。

固定長はあらゆる意味で地獄です。まぁやるしかないんだけど、マジで列名だけは絶対につけよう。つけてくれ。

また、可変長(区切り文字がある)CSVの列の長さ(OutputColumnWidth)は実は0でも設定できます。割と柔軟にバッファを取ってくれるので、面倒だったら全選択してそうやってしまっても良いかもです。(どこまでサイズをとってくれるかは未検証)DT_STRだと255バイトまでいけました。

Expressionsから色々動的に変更できます。需要は滅多にないと思いますが、列区切り記号もExpressionsから動的に変更することができます。(何故か行区切り記号は不可)この辺を参考にしてみてください。

OLE DB 接続マネージャー

特に言うことはないです。

SQL Serverとの接続ならこれで十分。データベース単位で作成する必要があります。(まぁUse使ったりなんだりすると別に関係ないけど、)

ODBC 接続マネージャー

超大型地雷。絶対に使ってはいけない。SSISODBC接続するぐらいならC#で適当にコード書け。書いた方が良いとかじゃない。書け。

どうしても使わないといけない場合は以下の点に注意すること。

  1. 64bit版のWindowsにはODBCアドミニストレーターツールが64bit版と32bit版の二つがある。(割と有名な話だし、ぐぐるといっぱい出てくるのでこれは知っている人も多いと思う。)
  2. Visual Studioは64bit版が提供されていない。
  3. そのため、ODBC接続マネージャーで出てくるデータソース名の一覧は32bit版にのみ紐付いており、どう頑張っても64bit版のデータソース名は引っ張ってこれない。
  4. SSISの実行環境は64bit版も提供されているため、64bit版のDSNを指定できれば当然動くんだけど、どう頑張っても指定できない。

解決策としては「32bit版と64bit版のドライバをインストールし、全く同名かつ全く同内容のDSNを作成して無理矢理呼び出す」という死ぬほど頭が悪そうな方法しかないです。

しかも何故か検証時にExpressionsで設定したConnectionStringではなく、動的に変更される前の接続文字列でValidetionを始めるため、その時に指定していたDSNで接続に失敗(DSN自体が存在しないなども含む)したら当然の如くエラーを吐き異常終了します。

まとめると、「開発環境及び本番環境に32bit版のドライバと64bit版のドライバをインストールし、全く同名かつ同内容のDSNを作成する必要があり、テスト用のDSNを使っててそのまま本番環境に持って行くとエラーで落ちる。」接続マネージャーです。こんなゴミを使ってはいけません。

まとめ

まぁとりあえずはこんなもんです。

参考