SQL Azure Migration Wizard v1.9.1 で日本語環境だとデータのインポートが出来ない!!ので、細工が必要です。
SQL Azure で BCP を試してみる - お だ のスペース にて見つけた SQL Database Migration Wizard v3.9.14 & v4.0.17 - Home を試してみました。
説明に、BCP を使ってデータのマイグレーションも出来るよって書いてあるので実際にやってみましたが、データのインポートが出来ません。
画面の出力には、BCP にてエクスポートしたよってのが出てるのですが、何故かインポートされませんでした。
Could not find number of records copied. File will not be uploaded.
のメッセージが曲者そうです。
そこで、SQLAzureMW.docx というドキュメントをダウンロードしてどうすればインポート出来るか見てみました。
ドキュメントには、出力したSQLスクリプトに、「// BCPArgs」ってコメント行が出力されるから、それを消さなければインポートされるよと図入りで解説してありました。
しかし、試した結果のスクリプトを確認しても、// BCPArgs なんてありません。
埒があかないので、ソースを見てみました。そこで、原因判明!
ScriptDatasource.cs 一部抜粋 Line 619-641
while (retry > 0) { --retry; Match regMatch = Regex.Match(_bcpOutput.ToString(), "[0-9]+\\srows copied"); if (regMatch.Success) { Match rows = Regex.Match(regMatch.Value, "[0-9]+"); OutputSQLString("// BCPArgs:" + rows.Value + ":" + bcpArgsIn, Color.DarkGreen); OutputSQLString(Properties.Resources.Go, Color.Blue); retry = 0; } else if (retry == 0) { outputColor = Color.DarkRed; OutputAnalysisLine("Could not find number of records copied. File will not be uploaded." + Environment.NewLine, outputColor); } else { System.Diagnostics.Debug.WriteLine("Did not find number of records in BCP output"); Thread.Sleep(1000); } }
コードを確認してみると、// BCPArgs と出力されるのは、BCP を使ってエクスポートした結果の出力が、「数値 rows copied」という文字列を含んでいなければなりません。
この部分
Match regMatch = Regex.Match(_bcpOutput.ToString(), "[0-9]+\\srows copied");
しかし、日本語環境*1では、「rows copied」 では無く「行コピーされました」と出力されます。なので、// BCPArgs という行がスクリプトに出力されなかったようです。
この箇所を次のように変更すると、インポート出来ました。
// Match regMatch = Regex.Match(_bcpOutput.ToString(), "[0-9]+\\srows copied"); Match regMatch = Regex.Match(_bcpOutput.ToString(), "[0-9]+\\s行コピーされました");
ソースを修正するなんてやってらんね、という方は SQL Script タブのリッチテキストボックスに直接 //BCPArgs 〜 と書き込めば大丈夫です。
記述する箇所は、該当テーブルの CREATE 文の最後の GO の後に記述しましょう。記述する内容は、
// BCPArgs:<データ件数>:.<スキーマ>.<テーブル名>" in "<ファイル名>" -E -q -n -b 5000 GO<〜> の中はそれぞれの環境に合わせて下さい。データ件数やファイル名は、Result Summary タグに出力されています。
サンプル// BCPArgs:2000:.dbo.受注テーブル" in "C:\Users\shinsuke\AppData\Local\Temp\tmpD2DF.tmp" -E -q -n -b 5000 GOコメントの内容は、SQLAzureMW.exe.config の BCPArgsIn の値を参考にしています。
とここまで書きましたが、このツール凄い使えるやつだと思います。現在の所 SQL Azure に移行する場合のファーストチョイスじゃないでしょうか?
*1:私の環境の場合。Vista Home Business SP2 日本語版、SQL Server 2008 SP1 Developer Edition 日本語版