今回は、SQL Server のタスクに標準で備わっているデータエクスポートの機能を使ってTableデータをファイルに出力してみる。
環境
- DB: SQL Server 2012 SP4 (11.0.7001.0 (X64)) Evaluation or Express
- データソース: AdventureWorksLT2012
- データ保存先:ローカル ファイル(テキスト ファイル)
Import/Export WizardによるデータExport
SSMSを起動しオブジェクトエクスプローラーからAdventureWorksLT2012を右クリック→タスク→データのエクスポート を選択する。SQL Server インポートおよびエクスポート ウィザード
・ようこそ
・データソースの選択
認証:Windows認証
データベース:AdventureWorksLT2012
・変換先の選択
※データベース:AdventureWorksLT2012 の照合順序(SQL_Latin1_General_CP1_CI_AS) に対応したコードページを選択すること!! (コードページの選択を誤ると実行時にエラーになる)
コードページの例(抜粋)
Identifier | .NET Name | Additional information |
---|---|---|
1252 | windows-1252 | ANSI Latin 1; Western European (Windows) |
932 | shift_jis | ANSI/OEM Japanese; Japanese (Shift-JIS) |
65001 | utf-8 | Unicode (UTF-8) |
51932 | euc-jp | EUC Japanese |
※ファイル名に出力先のファイルのフルパスを設定する。
ディレクトリを予め作成していること。
・テーブルコピーまたはクエリの指定
・フラットファイル変換先の構成
※元データとして SalesLT.Customer テーブルを選択する。
区切りは規定値を使用する。
・パッケージの保存および実行
設定内容をすぐに実行するか、SSISパッケージとして再利用可能なように保存するかを選択できる。
→ SSISパッケージとして保存できるのは、Evaluation または Standard以上の商用ライセンスの場合のみ。
今は「すぐに実行」を選択する。
※以下図は、Evaluation または Standard以上の商用ライセンスの場合
※Developer または Express等の無償ライセンスの場合
・ウィザードの完了
設定内容の概要を確認します。
・操作の完了
エラー無く処理が完了すると下図のような結果が表示されます。
・出力結果
コードページの選択エラー
上記例では元データとして AdventureWorksLT2012 を使用している。AdventureWorksLT2012 の照合順序は SQL_Latin1_General_CP1_CI_AS であるため、対応したコードページとして「1252 (ANSI - ラテンI)」を選択しなければならないと説明している。
ここでは敢えてコードページを「932 (ANSI/OEM - 日本語 Shift-JIS)」に設定した場合で実行してみる。
・コードページを「932 (ANSI/OEM - 日本語 Shift-JIS)」に設定
・実行エラーが発生
・エラーメッセージ
→ コードページについて警告されている。
このように元のデータの照合順序と対応しないコードページを設定するとエラーとなり実行出来ない。
SSISパッケージの作成と再利用
上記事例ではExport処理を実施してしまうと操作を再利用することが出来ない。(もう一度ウィザードを始めから設定することになる)Evaluation または Standard 以上の商用ライセンスの場合はSSISパッケージをファイルとして保存することが出来、コマンドプロンプトまたはPowerShellから実行することが出来る。
今回はEvaluation Editionの環境でSSISパッケージの保存とPowerShellによる実行を試してみる。
・SSISパッケージの保存設定1
保存先としてSQL Server 又はファイルシステムが選択できるが、今回はファイルシステムを選択。
保護レベルとパスワードを設定。
・SSISパッケージの保存設定2
保存先のディレクトリを設定する
・ウィザードの完了
設定内容の概要を確認します。
・操作の完了
エラー無く処理が完了すると下図のような結果が表示されます。
・SSISパッケージの実行
SSISパッケージの実行にはコマンドプロンプトまたはPowerShellでDTEXECコマンドを使用します。
DTEXEC /f “[SSISパッケージの保存パス(.dtsx)]” /Decrypt [パスワード]
※SQL Server をバージョンアップした環境で上記DTEXECコマンドを実行すると以下のエラーが発生します。エラー: 2018-12-31 05:50:33.59 コード: 0xC0016020 ソース: 説明: エラー上記エラーはDTEXECコマンドに関連付けられているEXEの実体がSQL Server 2012ではない(古いVersion)になっていることが原因のようです。
0xC001700A “パッケージに含まれるバージョン番号が無効です。バージョン番号を現在のバージョン番号より大きくすることはできません。”
により、パッケージをバージョン 6 から 3 に移行できませんでした。
レジストリを書き換えれば良さそうな気もしますが、SQL Server 2012に対応いたEXEを指定するようにコマンドを記載すれば動作します。
PS C:\Users\hoge> & "C:\Program Files\Microsoft SQL Server\110\DTS\Binn\DTExec.exe" /f "C:\Temp\Export_Customer.dtsx" /Decrypt hogepin
Microsoft (R) SQL Server Execute Package Utility
Version 11.0.7001.0 for 64-bit
Copyright(C) Microsoft Corporation. All rights reserved.
開始: 5:54:24
進捗状況: 2018-12-3105:54:26.00
ソース: データ フロー タスク 1
検証しています: 0% の完了
進捗状況の終了
~
進捗状況: 2018-12-3105:54:26.59
ソース: データ フロー タスク 1
クリーンアップ: 100% の完了
進捗状況の終了
DTExec: パッケージの実行から返されました DTSER_SUCCESS (0)。
開始: 5:54:24
完了: 5:54:26
経過時間: 2.059 秒
※EXEのフルパスを指定する場合に「Program Files」のように間にスペースが入るパスを指定する場合は、パス名の前に「&」を追加すること。まとめ
- SSISを使ってデータをフラットファイルにExportする場合は、元データの照合順序と出力先のコードページの指定を正しく設定すること。
- 商用ライセンスではSSISパッケージを保存することが出来る。
- SSISパッケージを実行する場合は「DTEXEC」コマンドをPowerShell等で実行する。
- SQL Server のVersionが複数インストールされている環境では、DTEXECコマンドの指定でEXEのフルパスを指定すること。
追記(12/31)
SSISパッケージの保存で「ファイルシステム」ではなく、「SQL Server」を選んだケースを試してみたが、
- SSMSでIntegration Services にログインして「格納済のパッケージ」ディレクトリの「MSDB」の配下にSSISパッケージが格納されていることを確認。
- 実行したがエラーとなる。エラー内容から、Edtionの権限が認められていない模様。実行時はEvaluation Edition のインスタンスであったが、同じ環境下にExpress Edition のインスタンスが構築されており、その辺の問題かと。
- 上記のようにSSISパッケージをSQL Serverに保存したところ、以前の投稿で作成していた統合サービスカタログが初期化されてしまった…
Import/Export Wizard で作成したSSISパッケージをSQL Serverに保存するのはやめた方が良さそう…
参考
Code Page IdentifiersDTExec.exe を使用してコマンド プロンプトから SSIS パッケージを実行する