我完全理解以前的答案,但也认为更完整的答案将有助于其他搜索者...
如果您在生产类型表上进行更改,将会有帮助。
- 如果您对表中定义的身份列,你必须设置
IDENTITY_INSERT
和关闭围绕数据的重新插入。您还必须使用明确的列列表。
- 如果你想确保数据库中的不杀生的数据,使用
TRANSACTIONS
周围的截断/修改/重新插入过程
- 如果你有大量的数据,然后试图做到使SQ Server Management Studio中的变化可能会因超时而失败,并且可能会丢失数据。
要扩大@cjk给出的答案,看看下面:
注:“TUC”只是在此脚本真正的表名 开始占位尝试 开始交易
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
#tmp是一个tmp表的随机名吗? – Svish 2009-02-23 14:02:33
好的答案 - 我将首先运行 - 选择cast(silly_column as int),other_columns from bad_table 确保您没有任何转换问题,它们实际上都是整数。 – brendan 2009-02-23 14:02:50
在我编造的所有名字中,你对#tmp做了评论? – cjk 2009-02-23 14:03:43