В SQL Server измените столбец типа int на тип text
Я хотел бы изменить столбец в SQL Server с типа int на тип text, сохраняя при этом имя столбца. Таблица с этим столбцом содержит много данных, и я не хочу ее потерять. SQL Server, похоже, не поддерживает явные или неявные приведения из int в text, иначе это было бы довольно просто. Итак, как бы вы это сделали, используя только 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в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