Подтвердить что ты не робот

Изменить тип столбца с номерами от varchar до int

У нас есть два столбца в базе данных, которая в настоящее время имеет тип varchar (16). Вещь есть, она содержит числа и всегда будет содержать числа. Поэтому мы хотим изменить его тип на целое. Но проблема в том, что он, конечно, уже содержит данные.

Можно ли каким-либо образом изменить тип этого столбца от varchar до int и не потерять все те числа, которые уже есть? Надеюсь, что-то вроде sql, с которым мы можем просто работать, без необходимости создавать временные столбцы и создавать С# -программу или что-то сделать для преобразования и т.д. Я полагаю, что это может быть довольно легко, если SQL Server имеет некоторую функцию для преобразования строк в числа, но я очень нестабилен на SQL. В основном работает только с С# и доступ к базе данных через LINQ to SQL.

Примечание: Да, для того, чтобы столбец был varchar, в первую очередь это была не очень хорошая идея, но это, к сожалению, так, как они это делали.

4b9b3361

Ответ 1

Единственный надежный способ сделать это - использовать временную таблицу, но она не будет много sql:

select * into #tmp from bad_table
truncate table bad_table
alter bad_table alter column silly_column int
insert bad_table
select cast(silly_column as int), other_columns
from #tmp
drop table #tmp

Ответ 2

Самый простой способ сделать это:

alter table myTable alter column vColumn int;

Это будет работать до тех пор, пока

  • все данные будут помещаться внутри int
  • все данные могут быть преобразованы в int (т.е. значение "автомобиль" не сработает)
  • нет индексов, которые включают vColumn. Если есть индексы, вам нужно будет включить drop и создать для них, чтобы они вернулись туда, где вы были.

Ответ 3

Просто измените тип данных в студии управления

(вам может потребоваться перейти в "Инструменты" > "Параметры" > "Дизайнеры" и отключить параметр, который запрещает сохранение изменений, которые воссоздают таблицу)

Ответ 4

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

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

  • Если у вас есть столбец идентификатор, определенный в таблице, вам нужно будет установить IDENTITY_INSERT для включения и выключения повторной вставки данных. Вам также придется использовать явный список столбцов.
  • Если вы хотите быть уверенным в том, что не убиваете данные в базе данных, используйте TRANSACTIONS вокруг процесса truncate/alter/reinsert
  • Если у вас много данных, тогда попытка просто сделать изменение в SQ Server Management Studio может завершиться с тайм-аутом, и вы можете потерять данные.

Чтобы расширить ответ, полученный @cjk, посмотрите на следующее:

Примечание: "tuc" является просто заполнителем в этом script для реального имени табуляции   начните попытку     начать транзакцию

  print 'Selecting Data...'
  select * into #tmp_tuc from tuc

  print 'Truncating Table...'
  truncate table tuc

  alter table tuc alter column {someColumnName} {someDataType} [not null]
  ... Repeat above until done

  print 'Reinserting data...'
  set identity_insert tuc on
  insert tuc (
    <Explicit column list (all columns in table)>
  )
  select  
    <Explicit column list (all columns in table - same order as above)>
  from #tmp_tuc
  set identity_insert tuc off

  drop table #tmp_tuc
  commit
  print 'Successful!'
end try
begin catch
  print 'Error - Rollback'
  if @@trancount > 0
    rollback

  declare @ErrMsg nvarchar(4000), @ErrSeverity int
  select @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY()

  set identity_insert tuc off

  RAISERROR(@ErrMsg, @ErrSeverity, 1)
end catch