В SQL Server измените столбец типа int, чтобы ввести текст - PullRequest
7 голосов
/ 02 декабря 2009

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

Ответы [ 3 ]

9 голосов
/ 02 декабря 2009

Поскольку 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 или источнику. Вам также придется сделать больше, если у вашей колонки есть индекс.)

Переходит к Донни для синтаксиса преобразования.

[Изменить]

Том Х. предложил использовать хранимую процедуру sp_rename для переименования tempbar в bar (вместо шагов 4-6). Это решение для MS SQL Server, которое может работать во многих случаях. Описанное мной решение будет работать (с изменениями синтаксиса) для любой базы данных SQL независимо от версии. В моем случае я имел дело с первичными и внешними ключами, а не только с одним полем, поэтому мне пришлось тщательно упорядочить все операции и переносить их на несколько версий MS SQL Server - откровенная работа с моей стороны.

5 голосов
/ 02 декабря 2009

Просто дважды приведите его через промежуточный тип к тому, что вы хотите.

cast(cast(intField as varchar) as text)

0 голосов
/ 02 декабря 2009

Вот небольшой пример сценария, который показывает возможный метод:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...