--1、更改一个数据库中所有表字段为SmallDatetime数据类型->Datetime数据类型declare tb cursor for
SELECT sql='alter table ['+d.name
+'] alter column ['+a.name+'] datetime'
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.namedeclare @sql varchar(1000)
open tb
fetch next from tb into @sql
while @@fetch_status = 0
begin
exec(@sql)
fetch next from tb into @sql
end
close tb
deallocate tb

解决方案 »

  1.   

    --2、删除表的外键关系
    --删除外键约束
    declare tb cursor local for
    select s='alter table ['+c.name+'] drop constraint ['+b.name+']'
    from sysforeignkeys a
    join sysobjects b on b.id=a.constid
    join sysobjects c on c.id=a.fkeyid
    join syscolumns d on d.id=c.id and a.fkey=d.colid
    join sysobjects e on e.id=a.rkeyid
    join syscolumns f on f.id=e.id and a.rkey=f.colid 
    where e.name='要处理的表名'declare @s varchar(8000)
    open tb
    fetch next from tb into @s
    while @@fetch_status=0
    begin
    exec(@s)
    fetch next from tb into @s
    end
    close tb
    deallocate tb
      

  2.   

    --3、对所有含有种子的表重置初值
    declare tb cursor local for
    select s='DBCC CHECKIDENT (['+a.name+'], RESEED, 0)'
    from sysobjects a
    join syscolumns b on a.id=b.id and b.status=0x80 
    and a.xtype='U' and a.status>=0declare @s varchar(8000)
    open tb
    fetch next from tb into @s
    while @@fetch_status=0
    begin
    exec(@s)
    fetch next from tb into @s
    end
    close tb
    deallocate tb