前述のように、データにタブ文字、カンマ、または改行が含まれている場合、CSV でエクスポートおよびインポートすることは非常に困難になります。値がフィールドからオーバーフローし、エラーが発生します。長いフィールドに改行文字を含む複数行のテキストが含まれている場合、この問題はさらに悪化します。
このような場合の私の方法は、BCP コマンドライン ユーティリティを使用して SQL サーバーからデータをエクスポートし、次に MySQL で LOAD DATA INFILE .. INTO TABLE コマンドを使用してデータ ファイルを読み戻すことです。BCP は最も古い SQL サーバーの 1 つです。コマンド ライン ユーティリティ (SQL サーバーの誕生 - v6.5 までさかのぼります) ですが、現在でも使用されており、データを取得するための最も簡単で信頼性の高い方法の 1 つです。
この手法を使用するには、MySQL で同じまたは同等のスキーマを使用して各宛先テーブルを作成する必要があります。これを行うには、SQL エンタープライズ マネージャーでデータベースを右クリックし、[タスク] -> [スクリプトの生成...] を選択して、すべてのテーブルの SQL スクリプトを作成します。次に、手動でスクリプトを MySQL と互換性のある SQL に変換する必要があります (間違いなく、この作業の最悪の部分です)。最後に、MySQL データベースで CREATE TABLE コマンドを実行して、テーブルを SQL サーバーのバージョンと列方向に一致させ、空で準備ができているようにします。データ。
次に、次のように MS-SQL 側からデータをエクスポートします。
bcp DatabaseName..TableName out TableName.dat -q -c -T -S ServerName -r \0 -t !\t!
(SQL Server Express を使用している場合は、-S "ComputerName\SQLExpress" のように -S 値を使用します)
これにより、フィールドが ![tab]! で区切られた、TableName.dat という名前のファイルが作成されます。\0 NUL 文字で区切られた行。
.dat ファイルを MySQL サーバーの /tmp にコピーし、次のように MySQL 側にロードします。
LOAD DATA INFILE '/tmp/TableName.dat' INTO TABLE TableName FIELDS TERMINATED BY '!\t!' LINES TERMINATED BY '\0';
テーブル (この例では TableName) は MySQL 側で既に作成されている必要があることを忘れないでください。
この手順は、SQL スキーマの変換に関しては非常に手作業ですが、最も難しいデータでも機能し、フラット ファイルを使用するため、SQL Server に MySQL と通信するように説得する必要はありません。