alter table TableName alter column columnName int not null   with nocheck试试

解决方案 »

  1.   

    不是索引产生不能修改表, 是你的表中columnName列中有NULL,
    所以不能添加 not NULL 约束
     alter table TableName alter column columnName int not null --《--
      

  2.   

    有索引是不允许直接改的先删除索引,再改,再建索引with nocheck是不行的
      

  3.   

    --删除一个字段的所有索引/约束declare @tbname sysname,
    declare @fdname sysname,set @tbname='tablename'  --要处理的表名
    set @fdname='columnname'    --要处理的字段名declare hCForEach cursor global for
    --默认值约束
    select sql='alter table ['+b.name+'] drop constraint ['+d.name+']'
    from syscolumns a
    join sysobjects b on a.id=b.id and a.name=@fdname and b.name=@tbname 
    join syscomments c on a.cdefault=c.id
    join sysobjects d on c.id=d.id
    union --外键引用
    select s='alter table ['+c.name+'] drop constraint ['+b.name+']'
    from sysforeignkeys a
    join sysobjects b on b.id=a.constid
    join sysobjects c on c.id=a.fkeyid
    join syscolumns d on d.id=c.id and a.fkey=d.colid and d.name=@fdname
    join sysobjects e on e.id=a.rkeyid and e.name=@tbname
    join syscolumns f on f.id=e.id and a.rkey=f.colid 
    union --主键/唯一键/索引
    select case when e.xtype in('PK','UQ') then 'alter table ['+c.name+'] drop constraint ['+e.name+']'
    else 'drop index ['+c.name+'].['+a.name+']' end
    from sysindexes a
    join sysindexkeys b on a.id=b.id and a.indid=b.indid
    join sysobjects c on b.id=c.id and c.xtype='U' and c.name=@tbname
    join syscolumns d on b.id=d.id and b.colid=d.colid and d.name=@fdname
    left join sysobjects e on e.id=object_id(a.name)
    where a.indid not in(0,255)exec sp_msforeach_worker '?'
    --删除这些后,就可以修改字段的属性了
    alter table TableName alter column columnName int not null--修改后,再手工恢复索引/约束/默认值设置等
      

  4.   

    我发现SQL Server的企业管理器是可以做到在不删除索引的情况下修改字段的NULL约束的.
    但通过事件探测器看他的原理时发现它好像是通过临时表实现的,为了实现这个小改动要把整个表搬动一次也太过了吧,呵呵.谢谢大家参与讨论,迟下再结贴吧.