列タイプをntextからvarbinary(max)に変更します
-
22-07-2019 - |
質問
ntext
フィールドを持つテーブルがあります。 MSDN は、 ntext
は非推奨であり、他のデータ型を提案する:
ntext、text、およびimageデータ型は、Microsoft SQL Serverの将来のバージョンで削除される予定です。これらのデータ型を新しい開発作業で使用することは避け、現在それらを使用しているアプリケーションを変更することを計画してください。代わりに、nvarchar(max)、varchar(max)、およびvarbinary(max)を使用してください。
私の特定のケースでは、 varbinary(max)
に切り替えることにしました。テーブル定義を変更しようとしましたが、うまくいきませんでした。
ALTER TABLE MyTable ALTER COLUMN MyColumn VARBINARY(MAX);
タイプを varbinary(max)
に変更する可能性は何ですか?タイプを ntext
から変更しようとしました-> nvarchar(max)
、次に nvarchar(max)
から-> varbinary(max)
しかしそれは不可能です(エラー:データ型nvarchar(max)からvarbinary(max)への暗黙的な変換は許可されていません)。
唯一の有効な解決策は、タイプ varbinary(max)
の新しい列を追加し、既存の値を新しい列に変換してから古い列を削除することです。これには非常に長い時間がかかります(約15GBのデータセットでは約30分かかります)。私が同じことを達成するために他の可能性を調査しているのはそのためです(おそらくインプレース=データと変換を移動せずに)。
解決
ntext列に非テキストデータが含まれていたため、varbinary(max)を使用したと思いますか?その場合、別のvarbinary(max)列をテーブルに追加し、変換操作を実行してntextから新しい列にコピーする必要があると思います。次に、古い列を削除し、新しい列の名前を古い名前に変更します。
"データ型nvarchar(max)からvarbinary(max)への暗黙的な変換は許可されていません ''変換について明示的に説明する必要があることを意味します。
他のヒント
この変換は、ある時点で発生する必要があるようです。検索すると、多くの人がテキストからvarchar(max)に移動し、変換に20分以上かかると述べています。数分間調査した後の私の2セントは、福音として受け取らないでください。
テーブルが挿入のみを行う場合、保持テーブルの既存のデータを変換し、テーブルの名前を変更して、保持が本番になるようにすることができます。次に、ダウンタイム中に、新しく作成されたデータを古いテーブルから移動します。
更新を処理すると、もちろん事態はさらに複雑になります。
追加の列を追加するのがおそらく最善の方法です。 リスクを減らすために、この種のことを段階的に行うことを好みます
- 列varbinary(max)をNULL可能として追加
- 挿入コードを変更して両方の列に入力します
- 暇なときに、一晩言って、CASTでUPDATEステートメントを実行します
- 古い列のすべてのコードサポートを削除し、新しい列が読み取られるようにします
- 古い列をドロップし、必要に応じて新しい列をnull以外に変更します