原:http://topic.csdn.net/u/20100207/18/97b8dfc9-0bf6-4868-af0d-0d238d0ca8c8.html?23792alter table [IPC_ShipmentWeight] alter column [Name] nvarchar(50)
出错报:
消息 5074,级别 16,状态 1,第 1 行
对象'DF_IPC_ShipmentWeight_Name' 依赖于 列'Name'。
消息 4922,级别 16,状态 9,第 1 行
由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN Name 失败。我想是因为我的Name设置了一个默认值的约束的问题
-----------
那语句应该怎么写才能把字段类型更改掉又不影响他的约束呢?
谢谢

解决方案 »

  1.   

    试试
    --设置为不检查约束
    ALTER TABLE tb NOCHECK CONSTRAINT ALL 
    go--改类型--重新设置回检查约束
    ALTER TABLE tb CHECK CONSTRAINT ALL 
    GO不过不知道在改变数据类型的情况适不适用
      

  2.   

    哦。我100多个表从varchar改为nvarchar
    那如何在上一贴中的语句前加上先删除约束,再自动添加这个约束呢?
    declare @sql varchar(max)
    set @sql=''
    select @sql=@sql+ 'alter table ['+a.name+'] alter column ['+b.name+'] Nvarchar('+ltrim(b.length/2)+');' 
    from sysobjects a,syscolumns b,systypes c
    where a.id=b.id and b.xtype=c.xtype
    and a.xtype='u' and c.name='varchar'--print @sql
    --判断是否有约束
    --有删除
    exec(@sql)
    --有约束添加回原来的约束
      

  3.   

        declare @sql varchar(max)
    declare @sqlConstDrop varchar(max)
    declare @sqlConstAdd varchar(max)
        select @sql='alter table ['+a.name+'] alter column ['+b.name+'] nvarchar('+ltrim(b.length/2)+');' ,
    @sqlConstDrop ='alert table ['+a.name+'] drop constraint [DF_'+a.name+'_'+b.name+']',
    @sqlConstAdd ='alert table ['+a.name+'] ADD constraint [DF_'+a.name+'_'+b.name+']  DEFAULT ('''') FOR ['+b.name+']'
    from sysobjects a,syscolumns b,systypes c 
    where a.id=b.id and b.xtype=c.xtype 
    and a.xtype='u' and c.name='varchar' 
    print(@sql)
    print(@sqlConstDrop)
    print(@sqlConstAdd)
    -------------------------
    我用这个方法 ,那怎么取出当前要改改的字段的默认值是多少呢?
      

  4.   

    select 'alter table '+b.name+' add '+case when is_system_named =1 then  '' else ' CONSTRAINT '+c.name end+' default '+definition+' for '+a.name
    FROM syscolumns a,sys.tables b ,SYS.default_constraints c
    where a.id=b.object_id and a.cdefault=c.object_id 
    查询出结果 然后执行。 没测试过
      

  5.   

    declare @sql varchar(8000) 
    set @sql='' 
    select @sql=@sql+ case when isnull(d.name,'') = '' then '' else 'alter table ['+a.name+'] DROP CONSTRAINT '+d.name+';
    ' end +'alter table ['+a.name+'] alter column ['+b.name+'] Nvarchar('+ltrim(b.length/2)+') default '+e.text+';
    '
    from sysobjects a
    left join syscolumns b on a.id=b.id
    left join systypes c on b.xtype=c.xtype
    left join sysobjects d on d.parent_obj = a.id and d.xtype = 'D'
    left join syscomments e on d.id = e.id
    where   a.xtype='u' and c.name='char' 
      

  6.   


    是的,在2000以上就可以换系统表,并定义成max