SQLserver – インポートで行削除ができない

SQLserver – インポートで行削除ができない

インポートで行削除ができない

先日、SQLserver2005が動いているサーバーの外付けディスクがクラッシュしてしまいました。この中にはSQLserverのデータファイルも入っていました。重要なデータは他のサーバーにバックアップしてありましたが、SQLserverのデータファイルはコピーができないため、ファイルのバックアップはしていませんでした。ただデータは主なレコードを別のSQLserver2012にスクリプトでコピーをしていたため、全て失うということではありません。

コピーしたSQLserver2012のデータファイルをアタッチできれば、それだけで修復は終わりですが、バージョンが上位ということで、はねられてしまいます。しかたなく、別のフォルダに残っていた古いデータファイルをアタッチして、SQLserver2012からインポートすることにしました。

SQLserver2005のインポートには、転送先テーブル内の行を削除するというオプションがあり、それを使用してインポートしました。ところが結果を見ると、行(レコード)が複数できています。おかしいと思い再度やってみると、さらに同じ行が増えます。転送先テーブル内の行を削除するというオプションが効いていないようです。
転送先テーブル内の行を手動で削除すればいいのでしょうが、大変手間がかかります。新たにテーブルを作成するというオプションもありますが、この場合IDENTITYがコピーされず、手動で設定し直しとなります。初めてSQLserverにデータベースを作成する時はこの方法でおこなうのですが、今回のようにレコードだけのコピーに新たにテーブルを作成するというのは抵抗があります。

どうもおかしいと思い、ネットで調べてみると、なんとか見つかりました。どうもSQLserver2005のインポートのバグのようです。

インポートのウィザードではデータベースを選ぶと、全テーブルの一覧が出ます。そこで左上の変換元にチェックを入れると、全テーブルが選択されて反転表示されます。この状態でマッピングの編集を押すと設定ウィンドウが出て、行の削除とIDの挿入にチェックを入れます。これで次へを押せばインポートが実行されます。結果は最初に書いたように行の削除は行われず、行がダブルためIDの挿入もエラーを起こすという、めちゃめちゃな結果になります。


↑左上の変換元にチェック(全選択)

これを避けるためには、左上の変換元(全テーブル一括)のチェックを止めて、変換元テーブルの左側にあるチェックボックスを個別にオンにします。さらにこの変換元テーブルを1つ選択し、ハイライトさせた状態で「マッピングの編集」をクリックします。設定ウィンドウが出て、行の削除とIDの挿入にチェックを入れます。


↑テーブルを1つづつ選択

これを全てのテーブルに繰り返し設定します。全てのテーブルの設定がすんだら次へを押してインポートを実行します。結果は変換先のテーブルの行が削除され、IDも問題なく挿入されます。いくつもテーブルがあると少し大変になりますが、新たにテーブルを作成して、IDENTITYやキーの再設定をするよりはましといえます。
このようなバグはSQLserverのバージョンアップで解消されていると思われます。バージョンアップする方がいいとは思いますが、上位互換がなくなる機能もありますので、安定した運用に支障をきたすことがあります。バグは、方法があれば、できるだけ解消しておいた方がいいでしょう。

Comments are closed.