Варчар (255) в Варчар (Макс)
Можно ли изменить тип столбца в базе данных SQL Server 2008 с varchar(255)
в varchar(MAX)
без необходимости бросать стол и воссоздавать?
SQL Server Management Studio выдает сообщение об ошибке каждый раз, когда я пытаюсь сделать это с помощью этого, но, чтобы спасти себя, была бы головная боль, если бы я мог изменить тип без необходимости DROP и CREATE.
Спасибо
3 ответа
Вы должны быть в состоянии сделать это с помощью TSQL.
Что-то вроде
ALTER TABLE [table] ALTER COLUMN [column] VARCHAR(MAX)
"Сохранение изменений не разрешено. Внесенные вами изменения требуют удаления и повторного создания следующих таблиц. Вы внесли изменения в таблицу, которую невозможно создать заново, или включили параметр "Запретить сохранение изменений, для которых требуется повторное создание таблицы". Опция "Запретить сохранение изменений" не включена.
Это новая "функция" в SQL Server Management Studio 2008, которая по умолчанию включена. Всякий раз, когда вы вносите большее изменение, SSMS может воссоздать таблицу, только создав новую, а затем переместившись на данные из старой - все в фоновом режиме (эти изменения включают в себя переупорядочение ваших столбцов среди прочего).
Эта опция по умолчанию отключена, поскольку, если ваша таблица имеет ограничения FK и прочее, этот способ повторного выполнения таблицы может завершиться неудачно. Но вы определенно можете включить эту функцию!
http://i42.tinypic.com/19pegj.png
Это под Tools > Options
и как только вы уберете эту опцию, вы снова сможете вносить подобные изменения в структуру таблицы в конструкторе таблиц.
Знать
с чем-то вроде
ALTER TABLE [table] ALTER COLUMN [column] VARCHAR(MAX)
https://dba.stackexchange.com/questions/15007/change-length-of-varchar-on-live-prod-table
Ответ Мартина Смита:
Если вы увеличиваете его до varchar(100 - 8000)
(то есть что-нибудь кроме varchar(max))
и вы делаете это через TSQL, а не через графический интерфейс SSMS
ALTER TABLE YourTable ALTER COLUMN YourCol varchar(200) [НЕ] NULLи не изменяя обнуляемость столбца от
NULL
в NOT NULL
(который блокировал бы таблицу, пока все строки проверены и потенциально записаны в или из NOT NULL
в NULL
в некоторых случаях это только быстрое изменение метаданных. Возможно, придется подождать SCH-M
блокировка на столе, но как только он приобретет, что изменение будет в значительной степени мгновенным. Следует помнить, что во время ожидания SCH-M
заблокировать другие запросы будут заблокированы, а не перескочить очередь перед ним, так что вы можете рассмотреть возможность добавления SET LOCK_TIMEOUT
первый. Также убедитесь, что в ALTER TABLE
заявление, которое вы явно указываете NOT NULL
если это исходное состояние столбца, иначе столбец будет изменен, чтобы NULL
,