批量修改SQLServer数据库表字段属性

以下提供一些场景,各位举一反三自行发挥

修改所有varchar为nvarchar,同时保持字段长度一致

declare c_sql cursor for
      SELECT sql = 'alter table [' + d.name + '] alter column [' + a.name +
       '] nvarchar('+Convert(varchar,a.length)+')' --** 修改为什么属性
  FROM syscolumns a
  left join systypes b
    on a.xtype = b.xusertype
 inner join sysobjects d
    on a.id = d.id
   and d.xtype = 'U'
   and d.name <> 'dtproperties'
 where b.name = 'varchar'
   and not exists
 (SELECT 1
          FROM sysobjects
         where xtype = 'PK'
           and name in (SELECT name
                          FROM sysindexes
                         WHERE indid in (SELECT indid
                                           FROM sysindexkeys
                                          WHERE id = a.id
                                            AND colid = a.colid))) --** 排除主键修改
 order by d.name, a.name
 
 
declare @sql varchar(1000)
     open c_sql
     fetch next from c_sql into @sql
     while @@fetch_status = 0
     begin
     --select @sql
        exec(@sql)
     fetch next from c_sql into @sql
     end
     close c_sql
     deallocate c_sql 

修改所有字段smalldatetime为datetime类型且非空

declare c_sql cursor for
      SELECT sql = 'alter table [' + d.name + '] alter column [' + a.name +
       '] datetime not null' --** 修改为什么属性
  FROM syscolumns a
  left join systypes b
    on a.xtype = b.xusertype
 inner join sysobjects d
    on a.id = d.id
   and d.xtype = 'U'
   and d.name <> 'dtproperties'
 where b.name = 'smalldatetime'
   and not exists
 (SELECT 1
          FROM sysobjects
         where xtype = 'PK'
           and name in (SELECT name
                          FROM sysindexes
                         WHERE indid in (SELECT indid
                                           FROM sysindexkeys
                                          WHERE id = a.id
                                            AND colid = a.colid))) --** 排除主键修改
 order by d.name, a.name
 
 
declare @sql varchar(1000)
     open c_sql
     fetch next from c_sql into @sql
     while @@fetch_status = 0
     begin
     --select @sql
        exec(@sql)
     fetch next from c_sql into @sql
     end
     close c_sql
     deallocate c_sql 

**给所有字段添加默认值,以varchar为例:

declare c_sql cursor for
      SELECT sql = 'ALTER TABLE '+d.name+' ADD  CONSTRAINT [DF_'+d.name+'_'+a.name+']  DEFAULT ('''') FOR ['+a.name+']' --** 修改为什么属性
  FROM syscolumns a
  left join systypes b
    on a.xtype = b.xusertype
 inner join sysobjects d
    on a.id = d.id
   and d.xtype = 'U'
   and d.name <> 'dtproperties'
 where b.name = 'nvarchar'
   and not exists
 (SELECT 1
          FROM sysobjects
         where xtype = 'PK'
           and name in (SELECT name
                          FROM sysindexes
                         WHERE indid in (SELECT indid
                                           FROM sysindexkeys
                                          WHERE id = a.id
                                            AND colid = a.colid))) --** 排除主键修改
 order by d.name, a.name
 
 
declare @sql varchar(1000)
     open c_sql
     fetch next from c_sql into @sql
     while @@fetch_status = 0
     begin
     --select @sql
        exec(@sql)
     fetch next from c_sql into @sql
     end
     close c_sql
     deallocate c_sql
原文地址:https://www.cnblogs.com/cdoneiX/p/12258506.html