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 日本語版