全部要用alter table ...,似乎没有好办法,要用游标循环了

解决方案 »

  1.   

    不用游标也可以,下面是语句:
    declare @sql varchar(8000)
    set @sql=''
    select @sql=@sql+'alter table '+a.name+' add constraint df_'+a.name+'_'+b.name+' default(0) for '+b.name+char(13)
     from sysobjects a,syscolumns b
     where a.id=b.id and a.xtype='U' and a.name<>'dtproperties' and b.xtype=56
    --   and a.name='表名'
     order by a.name
    print
    --exec(@sql)若整个@sql长度会超过8000,则将and a.name='表名'这个条件加上一个表一个表的执行
    上面语句在所有int字段上都没有默认值时适用
      

  2.   

    写掉了点,是print @sql,看看全不全
      

  3.   

    这回写了个完整的,所有表的int字段上都没有默认值的情况下直接执行就可以了:
    declare @sql varchar(8000),@tb varchar(100)
    declare c cursor for
    select name from sysobjects where xtype='U' and name<>'dtproperties'
    open c
    fetch next from c into @tb
    while @@fetch_status=0
    begin
      set @sql=''
      select @sql=@sql+'alter table '+a.name+' add constraint df_'+a.name+'_'+b.name+' default(0) for '+b.name+char(13)
        from sysobjects a,syscolumns b
        where a.id=b.id and a.xtype='U' and a.name<>'dtproperties' and b.xtype=56
          and a.name=@tb
      if @sql<>''
        exec(@sql)
      fetch next from c into @tb
    end
    close c
    deallocate c
      

  4.   

    我用整个数据库 还有 单张表的int数据都没有改变
      

  5.   

    还有有些int字段时自动增长型的
    谢谢  pbsql(风云)
      

  6.   

    这下应该完整了:
    declare @sql varchar(8000),@tb varchar(100)
    declare c cursor for
    select name from sysobjects where xtype='U' and name<>'dtproperties'
    open c
    fetch next from c into @tb
    while @@fetch_status=0
    begin
      set @sql=''
      select @sql=@sql+'alter table '+a.name+' add constraint df_'+a.name+'_'+b.name+' default(0) for '+b.name+char(13)
        from sysobjects a,syscolumns b
        where a.id=b.id and a.xtype='U' and a.name<>'dtproperties' and b.xtype=56
          and a.name=@tb and COLUMNPROPERTY(b.id,b.name,'IsIdentity')<>1
          and 'df_'+a.name+'_'+b.name not in(select name from sysobjects where xtype='D')
      if @sql<>''
        exec(@sql)
      fetch next from c into @tb
    end
    close c
    deallocate c