Изменить тип столбца с номерами от varchar до int
У нас есть два столбца в базе данных, которая в настоящее время имеет тип varchar (16). Вещь есть, она содержит числа и всегда будет содержать числа. Поэтому мы хотим изменить его тип на целое. Но проблема в том, что он, конечно, уже содержит данные.
Можно ли каким-либо образом изменить тип этого столбца от varchar до int и не потерять все те числа, которые уже есть? Надеюсь, что-то вроде sql, с которым мы можем просто работать, без необходимости создавать временные столбцы и создавать С# -программу или что-то сделать для преобразования и т.д. Я полагаю, что это может быть довольно легко, если SQL Server имеет некоторую функцию для преобразования строк в числа, но я очень нестабилен на SQL. В основном работает только с С# и доступ к базе данных через LINQ to SQL.
Примечание: Да, для того, чтобы столбец был varchar, в первую очередь это была не очень хорошая идея, но это, к сожалению, так, как они это делали.
Ответы
Ответ 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