В SQL Server измените столбец типа int на тип text
Я хотел бы изменить столбец в SQL Server с типа int на тип text, сохраняя при этом имя столбца. Таблицы этот столбец имеет много данных, и я не хочу ее потерять. SQL Server, похоже, не поддерживает неявные или явные приведения из int в текст, иначе это было бы довольно просто. Итак, как бы вы это сделали, используя только SQL?
3 ответов
поскольку MS SQL Server (как и большинство баз данных) не поддерживает прямое изменение типа существующего столбца, вам придется сделать это шагами. Способ, которым я решал подобные проблемы в прошлом (предполагая, что ваша таблица называется "foo", а ваш столбец - "bar"):
ALTER TABLE foo ADD COLUMN tempbar text;
UPDATE foo SET tempbar = cast(cast(bar as varchar) as text);
ALTER TABLE foo DROP COLUMN bar;
ALTER TABLE foo ADD COLUMN bar text;
UPDATE foo SET bar = tempbar;
ALTER TABLE foo DROP COLUMN tempbar;
(некоторые синтаксисы SQL могут быть отключены, прошел год с тех пор, как я в последний раз делал это, на другой работе, поэтому у меня нет доступа к MS SQL Server или источнику. Вам также придется делать больше вещей, если ваш столбец имеет индекс на нем.)
опоры Донни синтаксис преобразования.
[Edit]
Тома Х. предложил использовать процедура sp_rename хранимая процедура для переименования tempbar
as bar
(вместо 4-6 шагов). Это решение для MS SQL Server, которое может работать при многих обстоятельствах. Решение, которое я описал, будет работать (с изменениями синтаксиса) на любой база данных SQL, независимо версии. В моем случае я имел дело с первичными и внешними ключами, а не только с одним полем, поэтому мне пришлось тщательно упорядочить все операции и быть переносимым через несколько версий MS SQL Server-явная работа в мою пользу.
просто дважды проведите его через промежуточный тип к тому, что вы хотите.
cast(cast(intField as varchar) as text)
вот небольшой пример скрипта, который показывает возможный метод:
create table test (id int)
create table test_tmp (id ntext)
insert into test
values (1)
insert into test
values (2)
insert into test_tmp
select convert(ntext,cast(id as nvarchar)) from test
drop table test
exec sp_rename 'test_tmp','test'
в основном мы создаем копию таблицы, а затем заполнить его. Сначала мы преобразуем int в nvarchar, затем берем текстовое значение. Наконец, удалить старую таблицу и переименовать временную таблицу.