SQL: изменение столбца данных таблицы - сохранение порядка столбцов - PullRequest
2 голосов
/ 20 июля 2011

Мне было поручено изменить некоторые столбцы данных в таблицах SQL (используя Sql CE Server 3.5, если это имеет значение).

Таблицы заполнены сотнями текстовых документов Excel, разделенных запятыми.

Код делает укол при определении типа данных столбца и таблица создается.

Позже мне понадобится возможность вернуться и сказать: «Нет, этот столбец с»Y 'и' N 'должны быть изменены на булевский тип вместо символьного типа. "

Я нашел информацию о том, как изменить таблицу (удалить столбец и вставитьновый), но смогу ли я вернуть столбцу таблицы то же значение индекса столбца, что и раньше, например "Вставить в индекс = X"?

enter image description here

Ответы [ 4 ]

3 голосов
/ 20 июля 2011

Нет способа добавить столбец с определенным индексом через ALTER TABLE.Такие инструменты, как Sql Server Management Studio и Visual Studio Premium с инструментами базы данных, могут это сделать.Но по крайней мере Visual Studio делает это через обходной путь:

  1. Удалите все ограничения, относящиеся к таблице, включая FK, указывающие на нее.
  2. Создайте таблицу с новым макетом под именем temp.
  3. Переместить все данные (возможно, включая IDENTITY INSERT для сохранения столбца IDENTITY)
  4. Удалить исходную таблицу.
  5. Переименовать таблицу с временным именем.
  6. Воссоздайте ограничения.

Если у вас есть такая возможность, я настоятельно рекомендую проект Visual Studio Premiums DB.Его механизм развертывания может обработать это автоматически для вас.

1 голос
/ 20 июля 2011

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

ALTER TABLE myTable
ALTER COLUMN myColumn Boolean
1 голос
/ 20 июля 2011

Есть несколько способов справиться с этим

  1. Сделайте, как заметил Андерс, чтобы воссоздать таблицу с нуля
  2. Не полагайтесь на порядок столбцов таблицы. Вместо этого используйте слой абстракции, например Views. (Представления SQL или представление объекта .NET)
  3. Не удаляйте и не создавайте заново столбец, а изменяйте его

Этот 3-й вариант сложен, потому что вам придется обновить значения до изменения. Например

Create table #temp  (foo char(1), bar int)
Insert into #temp VALUES ('Y', 0)
Insert into #temp VALUES ('N', 1)

UPDATE #temp 
SET foo = CASE WHEN foo = 'Y' THEN 1 ELSE 0 END

ALTER table #temp  alter column foo bit
SELECT * FROM #temp

Это легко в случае. Например, преобразование varchar (50) в дату и время будет немного сложнее

0 голосов
/ 20 июля 2011

Есть такие "подвохи", как это:

Сброс индекса столбца идентификации

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

Привет.

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