В SQL Server измените столбец типа int на тип text



Я хотел бы изменить столбец в SQL Server с типа int на тип text, сохраняя при этом имя столбца. Таблица с этим столбцом содержит много данных, и я не хочу ее потерять. SQL Server, похоже, не поддерживает явные или неявные приведения из int в text, иначе это было бы довольно просто. Итак, как бы вы это сделали, используя только SQL?

596   3  

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

Comments

    Ничего не найдено.