原: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设置了一个默认值的约束的问题
-----------
那语句应该怎么写才能把字段类型更改掉又不影响他的约束呢?
谢谢
出错报:
消息 5074,级别 16,状态 1,第 1 行
对象'DF_IPC_ShipmentWeight_Name' 依赖于 列'Name'。
消息 4922,级别 16,状态 9,第 1 行
由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN Name 失败。我想是因为我的Name设置了一个默认值的约束的问题
-----------
那语句应该怎么写才能把字段类型更改掉又不影响他的约束呢?
谢谢
--设置为不检查约束
ALTER TABLE tb NOCHECK CONSTRAINT ALL
go--改类型--重新设置回检查约束
ALTER TABLE tb CHECK CONSTRAINT ALL
GO不过不知道在改变数据类型的情况适不适用
那如何在上一贴中的语句前加上先删除约束,再自动添加这个约束呢?
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)
--有约束添加回原来的约束
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)
-------------------------
我用这个方法 ,那怎么取出当前要改改的字段的默认值是多少呢?
FROM syscolumns a,sys.tables b ,SYS.default_constraints c
where a.id=b.object_id and a.cdefault=c.object_id
查询出结果 然后执行。 没测试过
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'
是的,在2000以上就可以换系统表,并定义成max