В 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, затем берем текстовое значение. Наконец, удалить старую таблицу и переименовать временную таблицу.