Проблема в преобразовании VARCHAR в INT - PullRequest
0 голосов
/ 18 декабря 2010

У меня проблема с изменением типа данных с VARCHAR (50) на INT для столбца. Я много пробовал, но все еще не получал его, и это без использования переменных, а также после необходимости добавить идентичность в этот столбец после преобразования из varchar в int.

Заранее спасибо

Ответы [ 4 ]

3 голосов
/ 18 декабря 2010

Когда ALTER TABLE ... ALTER COLUMN не поддерживается (как в вашем случае), изменение типа столбца лучше всего выполнить в четыре этапа:

  • добавить новый столбец с правильным типом
  • обновить базу данных, чтобы она соответствовала значениям в старом и новом столбце
  • используя sp_rename, поменяйте имя нового столбца со старым столбцом
  • отбросить старый столбец

Альтернатива:

  • создать новую таблицу с нужными столбцами
  • скопировать данные в новую таблицу
  • использовать sp_rename, чтобы поменять имена между старой и новой таблицами
  • уронить старый стол

Лучший путь зависит от многих факторов, таких как размер данных, существующие ограничения, внешние ключи, ссылающиеся на таблицу, некластеризованные индексы, представления и пользовательские функции, ссылающиеся на таблицу, репликация, существующие триггеры и процедуры и т. Д. И т. Д. И т. Д. , Невозможно дать простой ответ, потому что сама проблема сложна, если учитывать all значения.

1 голос
/ 18 декабря 2010

Вы можете попробовать многошаговый процесс, такой как:

/** Add new column with identity **/
ALTER TABLE MyTable
ADD NewColumnTempName INT NOT NULL IDENTITY (1, 1) DEFAULT (0)
GO

/** Allow us to enter values into the entity field **/
SET IDENTITY_INSERT MyTable ON;
GO

/** Push the data from the varchar column into the new column **/
UPDATE MyTable
SET NewColumnTempName = CAST(OldColumnName AS INT);
GO

/** Get rid of the old column **/
ALTER TABLE MyTable
DROP OldColumnName;
GO

/** Rename the newcolumn tot he old name **/
EXEC sp_rename 'MyTable.NewColumnTempName', 'OldColumnName', 'COLUMN';

/** Switch back on the identity column **/
SET IDENTITY_INSERT MyTable OFF
GO
0 голосов
/ 18 декабря 2010

Вам нужно удалить DEFAULTS, CHECKS и т. Д., ALTER colum и воссоздать DEFAULTS, CHECKS и ключи

ALTER TABLE T DROP CONSTRAINT C1
ALTER TABLE T DROP CONSTRAINT C2
ALTER TABLE T DROP CONSTRAINT C3
...
ALTER TABLE T ALTER COLUMN Cl int [null|notnull]
ALTER TABLE T ADD 
CONSTRAINT C1 ... ,
CONSTRAINT C2...,
CONSTRAINT C3...,
0 голосов
/ 18 декабря 2010

Первое очевидное предположение состоит в том, что в вашем столбце есть данные, которые нельзя преобразовать в INT. Возвращает ли это какие-либо результаты?

select ColumnYouWantToConvert
    from YourTable
    where isnumeric(ColumnYouWantToConvert) = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...