Вопрос

У меня есть таблица с полем 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 минут). Вот почему я изучаю другие возможности для достижения того же (возможно, на месте = без перемещения данных и преобразования).

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

<Ол>
  • Добавьте столбец varbinary (max) как обнуляемый
  • Измените код вставки, чтобы заполнить оба столбца
  • На досуге, скажем, на ночь, запустите оператор UPDATE с CAST
  • Удалите всю поддержку кода для старого столбца, убедитесь, что новый столбец прочитан
  • Удалите старый столбец и при необходимости измените новый столбец на ненулевой.
  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top