Изменение типа столбца с данными без удаления данных

У меня есть столбец, который, я считаю, был объявлен неверно. Он содержит данные, и я не хочу потерять данные.

Я хочу изменить определение из varchar (max) в varchar (целое число). Я был под впечатлением, что не могу просто изменить тип столбца?

Является лучшим методом для создания столбца temp, "column2", переноса данных в этот столбец, из столбца с проблемным типом, удаления столбца проблемы и последующего переименования столбца temp в исходный проблемный столбец?

Если да, то как мне скопировать значения из столбца проблемы в новый столбец?

EDIT: для тех, кто с одинаковой проблемой, вы можете просто использовать инструкции ALTER.

Ответ 1

Пока типы данных несколько "связаны" - да, вы можете это сделать абсолютно.

Вы можете изменить INT на BIGINT - диапазон значений второго типа больше, поэтому вам не грозит "потерять" любые данные.

Вы можете изменить VARCHAR(50) на VARCHAR(200) - снова, типы совместимы, размер становится все больше - нет риска усечения чего-либо.

В принципе, вам просто нужно

ALTER TABLE dbo.YourTable
ALTER COLUMN YourColumn VARCHAR(200) NULL

или что угодно. До тех пор, пока у вас нет строки длиннее 200 символов, все будет в порядке. Не уверен, что произойдет, если у вас есть более длинные строки - либо преобразование завершится с ошибкой, либо оно будет продолжено и сообщит вам, что некоторые данные могут быть усечены. Поэтому я предлагаю вам сначала попробовать это с копией ваших данных: -)

Это немного сложнее, если вам нужно изменить VARCHAR на INT или что-то в этом роде - очевидно, если у вас есть значения столбцов, которые не "вписываются" в новый тип, преобразование не удастся, Но даже использование отдельного "временного" нового столбца не будет исправлять это - вам нужно как-то разобраться с этими "несовместимыми" случаями (игнорировать их, оставить там NULL, установить их по умолчанию - что-то).

Кроме того, переход между VARCHAR и NVARCHAR может оказаться сложным, если у вас есть, например, не западные европейские символы - вы можете потерять определенные записи при конверсии, поскольку они не могут быть представлены в другом формате, или преобразование по умолчанию из одного типа в другое не работает должным образом.

Ответ 2

Вычислить максимальную длину данных, хранящую этот столбец в этой таблице.

Select max(len(fieldname)) from tablename

Теперь вы можете уменьшить размер этого столбца до результата, полученного в предыдущем запросе.

ALTER TABLE dbo.YourTable
ALTER COLUMN YourColumn VARCHAR(200) NULL

Ответ 3

добавить temp column2 с типом varchar (NN), запустить update tbl set column2 = column, проверить, произошла ли какая-либо ошибка; если все в порядке, измените исходный столбец, скопируйте данные и удалите столбец2.