我有一表 table1其中有一字段是sName varchar(10)现在我想通过SQL语句将其修改为 varchar(20)alter table1 alter column sName varchar(20)总要报错,提示有依赖于此列的对象,可我检查了一下除了有个默认值之外就没有了啊,我把默认值删除了。也不能修改。请问:
有没有什么语句可以忽略依赖于此字段的所以对象,直接修改呢?如果没有,请问用什么办法修改?

解决方案 »

  1.   

    --表的外键约束SELECT 外键表ID=b.fkeyid
    ,外键表名称=object_name(b.fkeyid)
    ,外键列ID=b.fkey
    ,外键列名=(SELECT name FROM syscolumns WHERE colid=b.fkey AND id=b.fkeyid)
    ,主键表ID=b.rkeyid
    ,主键表名=object_name(b.rkeyid)
    ,主键列ID=b.rkey
    ,主键列名=(SELECT name FROM syscolumns WHERE colid=b.rkey AND id=b.rkeyid)
    ,级联更新=ObjectProperty(a.id,'CnstIsUpdateCascade')
    ,级联删除=ObjectProperty(a.id,'CnstIsDeleteCascade')
    FROM sysobjects a
    join sysforeignkeys b on a.id=b.constid
    join sysobjects c on a.parent_obj=c.id
    where a.xtype='f' AND c.xtype='U'
    --查询一个表的所有外键:SELECT 主键列ID=b.rkey
    ,主键列名=(SELECT name FROM syscolumns WHERE colid=b.rkey AND id=b.rkeyid)
    ,外键表ID=b.fkeyid
    ,外键表名称=object_name(b.fkeyid)
    ,外键列ID=b.fkey
    ,外键列名=(SELECT name FROM syscolumns WHERE colid=b.fkey AND id=b.fkeyid)
    ,级联更新=ObjectProperty(a.id,'CnstIsUpdateCascade')
    ,级联删除=ObjectProperty(a.id,'CnstIsDeleteCascade')
    FROM sysobjects a
    join sysforeignkeys b on a.id=b.constid
    join sysobjects c on a.parent_obj=c.id
    where a.xtype='f' AND c.xtype='U'
    and object_name(b.rkeyid)='titles'
      

  2.   

    to:liangCK 
     那又怎么实现SQL语句修改呢?
    to:kk19840210 可以在企业管理器中修改。但我们是做产品,且产品已发布,所以只能以脚本方式修改。to:allen_cn 报的错就是:有一个或多个对象依赖于该列。
      

  3.   

    alter table table1  alter  column [sName] varchar(20) 
    在企业管理器里看看有没有外键 或者存在触发器
      

  4.   


    看看是否设置了约束(check,defult默认值,Fk外键,Pk主键),或者是否在这个字段上面有触发器
      

  5.   


    sp_help tablename
    查看一下:
    看看是否设置了约束(check,defult默认值,Fk外键,Pk主键),
    如果有,则取消约束再运行脚本:
    alter   table   table1     alter     column   [sName]   varchar(20)   
    再添加约束
      

  6.   

    上面查外键引用的不对,用下面的可以查到。结果列出了所有引用该表的表和外键的名称。
    select 
     convert(varchar(20),(select name from dbo.sysobjects where id = a.constid)) as 外键名称,
     convert(varchar(20), (select name from dbo.sysobjects where id = a.fkeyid)) as 引用表,
     convert(varchar(20), (select name from dbo.sysobjects where id = a.rkeyid)) as 主表
     from dbo.sysforeignkeys a
     where rkeyid in(select id from dbo.sysobjects where name = '主表名称')
      

  7.   

    更新的例子
    --直接执行报错
    alter table mas alter column ida varchar(20)
    go
    /*
    服务器: 消息 5074,级别 16,状态 8,行 5
    对象 'PK_mas' 依赖于 列 'ida'。
    服务器: 消息 4922,级别 16,状态 1,行 5ALTER TABLE ALTER COLUMN ida 失败,因为有一个或多个对象访问此列。
    */
    --删除所有外键引用
    ALTER TABLE [dbo].[sub] DROP CONSTRAINT [FK_sub_mas]
    --删除主键
    ALTER TABLE [dbo].[mas] DROP CONSTRAINT [PK_mas]--修改主表
    alter table mas alter column ida varchar(20) not null--注意主键要加  not null
    --修改所有引用表
    alter table sub alter column ida varchar(20) 
    --恢复主键
    ALTER TABLE [dbo].[mas] ADD CONSTRAINT [PK_mas] PRIMARY KEY  CLUSTERED ([ida])  ON [PRIMARY] 
    --恢复所有外键
    ALTER TABLE [dbo].[sub] ADD CONSTRAINT [FK_sub_mas] FOREIGN KEY([ida]) REFERENCES [mas] ([ida])
      

  8.   


    create table tb(a text)
    insert into tb values ('aaaaaa')
    go
    alter table tb alter column a char(255)
    go
    select * from tb
    drop table tb
    ---结果集
    (1 row(s) affected)
    a
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    aaaaaa                                                                                                                                                                                                                                                         (1 row(s) affected)
      

  9.   

    用脚本的话, 要做的东西就多了不过你可以这样做啊, 找一个环境一样的 sql , 在企业管理器中修改(不要保存, 只做改的操作), 做完后,在工具栏上有个生成脚本(好像是第三个按钮吧), 把里面的脚本复制出来就可以拿到产品环境去用了.
      

  10.   

    如果要自己写脚本的话, 是很痛苦的
    至少要考虑如下东西:
    1. 约束, 包括字段默认值/CHECK约束
    2. 索引, 包括主键/唯一键/索引/统计
    3. 外键约束
    改的时候要把与要修改的列相关的上述东西删除, 改完后还要加回来所以你即要找到查找上述对象的方法, 还要想办法查出这些对象的所有信息, 以便能生成重建的脚本
    当然这个肯定是写得出来的啦
      

  11.   

    首先感谢各位的回复!由于公司开发区不能上网,所以对没有及时回复大家说声抱歉!首先运用上面的方法,查询了表,该字段并没有任何约束,默认,外键等。但还是要报错,报错信息为:服务器: 消息 5074,级别 16,状态 8,行 1
    统计 'hind_1724077428_21A_7A_8A_16A_19A_24A_27A_35A_43A_51A' 依赖于 列 'salemoney'。
    服务器: 消息 4922,级别 16,状态 1,行 1
    ALTER TABLE ALTER COLUMN salemoney 失败,因为有一个或多个对象访问此列
    邹大侠的方法是可以,但不足处在于,由于是产品,所以每个客户的数据库经历版本的升级等,版本不同的原因,并不能将我生成的SQL语句通用于所有用户。请各位大侠再想想办法!
      

  12.   

    我的语句是ALTER   TABLE dlysale   ALTER   COLUMN   salemoney
      

  13.   

    不熟,提供删除参考http://support.microsoft.com/kb/916278/zh-cn