Изменить тип столбца с ntext на varbinary (max) - PullRequest
5 голосов
/ 13 марта 2009

У меня есть таблица с полем 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), преобразовать существующее значение в новый столбец и затем удалить старый столбец. Это занимает ОЧЕНЬ СЛИШКОМ МНОГО времени (в моем наборе данных около 15 ГБ это занимает около 30 минут). Вот почему я изучаю другие возможности для достижения того же (возможно, на месте = без перемещения данных и преобразования).

Ответы [ 3 ]

3 голосов
/ 13 марта 2009

Полагаю, вы использовали varbinary (max), потому что в вашем столбце ntext были нетекстовые данные? В этом случае, я думаю, вам нужно добавить отдельный столбец varbinary (max) в вашу таблицу, а затем запустить операцию преобразования, чтобы скопировать из ntext в новый столбец. Затем удалите старый столбец и переименуйте новый столбец в старое имя.

«Неявное преобразование из типа данных nvarchar (max) в varbinary (max) недопустимо» означает, что вам нужно будет явно указать преобразование.

0 голосов
/ 13 марта 2009

Добавление дополнительного столбца, вероятно, лучший способ. Я предпочитаю делать такие вещи поэтапно, чтобы снизить риски

  1. Добавить столбец varbinary (max) как обнуляемый
  2. Измените код вставки, чтобы заполнить оба столбца
  3. На досуге, скажем, в одночасье, запустите оператор UPDATE с CAST
  4. Удалите всю поддержку кода для старого столбца, убедитесь, что новый столбец прочитан
  5. Удалите старый столбец и при необходимости измените новый столбец на ненулевой
0 голосов
/ 13 марта 2009

Кажется, что это преобразование должно произойти в какой-то момент. Если вы выполните поиск, вы увидите, что многие люди переходят от текста к varchar (максимум) и заявляют, что конвертация занимает более 20 минут. Мои два цента после исследования в течение нескольких минут, так что не воспринимайте это как Евангелие.

Если ваша таблица просто принимает вставки, вы можете преобразовать существующие данные в таблицу хранения, а затем переименовать таблицы, чтобы хранение стало производственным. Затем переместите все вновь созданные данные из старой таблицы во время простоя.

Обработка обновлений, конечно, усложняет ситуацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...