移动表到别的文件组,考虑了架构的问题

/* --先加文件组和文件再执行脚本

declare @tb varchar(200)
declare @sch varchar(200)
declare @filegroup varchar(200)='Hist'
declare cu cursor for
select name,schema_name(schema_id) from sys.objects where type='u' and schema_id in
(select schema_id from sys.schemas where name like 'Hist[_]%')
open cu
fetch next from cu into @tb,@sch
while @@FETCH_STATUS=0
begin
--begin try
exec DBAdmin.sp_MoveTable @tb,@filegroup,@sch
--end try
--begin catch
--print @tb+'.'+@sch
--end catch
fetch next from cu into @tb,@sch
end
close cu
deallocate cu

 

*/

 

create Proc DBAdmin.sp_MoveTable
 (
    
    @objectname sysname,
     @NewFileGroup sysname=NULL,
     @objectschema sysname='dbo'
 )
 As
     Set Nocount On
     Declare @objectid int
   
    Select @objectid=object_id,@objectname=name
         From sys.objects As a
         Where name=@objectname AND schema_id=SCHEMA_ID(@objectschema)
                 And Type='U'
                And is_ms_shipped=0
                 And    Not Exists(Select 1
                                    From sys.extended_properties
                                    Where major_id=a.object_id And
                                         minor_id = 0 and
                                        class = 1 and
                                        name = N'microsoft_database_tools_support'
                                 )
     If @objectid Is Null
     Begin
         Raiserror 50001 N'无效的表名!'
         Return
     End
     
    If filegroup_id(@NewFileGroup) Is Null And @NewFileGroup>''
     Begin
         Raiserror 50001 N'错误的文件组!'
         Return
     End
 
     IF @NewFileGroup Is Null
         Select @NewFileGroup=name From sys.filegroups Where is_default=1
   
    If Exists(Select 1 From sys.indexes As a Inner Join sys.filegroups As b On b.data_space_id=a.data_space_id Wherea.object_id=@objectid  Andb.name=@NewFileGroup And (a.type=0 Or is_primary_key=1))
     Begin
         Print N'表'+@objectname+N'已在文件组'+@NewFileGroup+N' .不需要移动! '
         Return
     End
    
    Declare    @sql nvarchar(4000),
             @Enter nvarchar(20),
             @PrimaryKey sysname
 
     Select @sql='',@Enter=Char(13)+Char(10)
 
     --删除主键、外键、索引
     Select @sql=@sql+'Alter Table '+QUOTENAME(@objectschema)+'.'+Quotename(object_name(a.parent_object_id))+' Drop Constraint '+Quotename(a.name)+@Enter
         From sys.Foreign_keys As a
         Where a.referenced_object_id=@objectid
 
     Select @sql=@sql+
             Case When b.object_id Is Not Null Then 'Alter Table '+QUOTENAME(@objectschema)+'.'+Quotename(@objectname)+' Drop Constraint '+Quotename(a.name)+
                     Case a.type_desc When 'CLUSTERED' Then ' With (Move To '+Quotename(@NewFileGroup)+')' Else '' End
             Else 'Drop Index '+QUOTENAME(@objectschema)+'.'+Quotename(@objectname)+'.'+Quotename(a.name)
             End +@Enter
         From sys.indexes As a
             Left Outer Join sys.objects As b On b.parent_object_id=a.object_id And b.Type In('PK','UQ') And b.name=a.name
         Where a.object_id=@objectid And a.name Is Not Null
    
   
    If Not Exists(Select * From sys.indexes Where object_id=@objectid And is_primary_key=1)
     Begin
         Set @PrimaryKey='ID'+Replace(Newid(),'-','')
         --创建主键(在表没有主键的情况)
         Set @sql=@sql+'Alter Table '+QUOTENAME(@objectschema)+'.'+Quotename(@objectname)+' Add'+@PrimaryKey +' uniqueidentifier Not Null ,ConstraintDF_'+@objectname+'_'+@PrimaryKey+' Default(newid()) For'+@PrimaryKey+''+
                 ',Constraint PK_'+@objectname+'_'+@PrimaryKey+' Primary Key ('+@PrimaryKey+' Asc)'+@Enter  
         --删除主键
         Set @sql=@sql+'Alter Table '+QUOTENAME(@objectschema)+'.'+Quotename(@objectname)+' Drop ConstraintPK_'+@objectname+'_'+@PrimaryKey +' With (Move To '+Quotename(@NewFileGroup)+')'+@Enter
         Set @sql=@sql+'Alter Table '+QUOTENAME(@objectschema)+'.'+Quotename(@objectname)+' Drop ConstraintDF_'+@objectname+'_'+@PrimaryKey+@Enter
         Set @sql=@sql+'Alter Table '+QUOTENAME(@objectschema)+'.'+Quotename(@objectname)+' Drop Column'+@PrimaryKey+@Enter
     End
 
     --创建主键、外键、索引
     Select @sql=@sql+
             Case When b.object_id Is Not Null Then 'Alter Table '+QUOTENAME(@objectschema)+'.'+Quotename(@objectname)+' Add Constraint '+Quotename(a.name)+
                 Case a.is_primary_key When 1 Then ' Primary Key ' Else 'Unique ' End+'('+c.x+')'
             Else
                'Create Index '+Case a.type_desc When 1 Then 'Unique ' Else '' End+
                 Case a.type_desc When 'CLUSTERED' Then 'CLUSTERED ' Else '' End +
                 Quotename(a.name)+' On '+QUOTENAME(@objectschema)+'.'+Quotename(@objectname)+'('+c.x+')'+ Isnull(' Include('+d.x+')','')
             End +@Enter
         From sys.indexes As a
             Left Outer Join sys.objects As b On b.parent_object_id=a.object_id And b.Type In('PK','UQ') And b.name=a.name
             Outer Apply(Select x=Stuff((Select ','+Quotename(y.name)+Case x.is_descending_key When 1 Then ' Desc' Else ' Asc' End
                                             From sys.index_columns As x   
                                                Inner Join sys.columns As y On y.object_id=x.object_id And x.column_id=y.column_id
                                             Where x.object_id=a.object_id And x.index_id=a.index_id And x.is_included_column=0
                                             For Xml Path('')
                                         ),1,1,'')
                         ) As c
            Outer Apply(Select x=Stuff((Select ','+Quotename(y.name)
                                             From sys.index_columns As x   
                                                Inner Join sys.columns As y On y.object_id=x.object_id And x.column_id=y.column_id
                                             Where x.object_id=a.object_id And x.index_id=a.index_id And x.is_included_column=1
                                             For Xml Path('')
                                         ),1,1,'')
                         ) As d
         Where a.object_id=@objectid And a.name Is Not Null
 
 
    Select @sql=@sql+'Alter Table '+QUOTENAME(@objectschema)+'.'+Quotename(object_name(a.parent_object_id))+' Add Constraint '+Quotename(a.name)
                 +' Foreign Key ('+b.x+') References '+Quotename(@objectname)+'('+c.x+')'+@Enter
         From sys.Foreign_keys As a
             Outer Apply(Select x=Stuff((Select ','+Quotename(y.name )
                                             From sys.Foreign_key_columns As x
                                                 Inner Join sys.columns As y On y.object_id=x.parent_object_id And y.column_id=x.parent_column_id
                                             Where x.constraint_object_id=a.object_id
                                             For Xml Path('')
                                        ),1,1,'')
                         ) As b
             Outer Apply(Select x=Stuff((Select ','+Quotename(y.name )
                                             From sys.Foreign_key_columns As x
                                                 Inner Join sys.columns As y On y.object_id=x.referenced_object_id And y.column_id=x.referenced_column_id
                                             Where x.constraint_object_id=a.object_id
                                             For Xml Path('')
                                        ),1,1,'')
                         ) As c
             Where a.referenced_object_id=@objectid
 --print @sql
     --执行脚本
     Begin Try
         Begin Tran
             Exec(@sql)
         Commit Tran
         Print N'表'+@objectschema+'.'+@objectname+N'数据移动到到文件组'+@NewFileGroup+N' .成功! '
     End Try
     Begin Catch
         Declare @Error nvarchar(1024)
         Set @Error=ERROR_MESSAGE()
         Raiserror 50001 @Error
         Print N'表'+@objectschema+'.'+@objectname+N'数据移动到到文件组'+@NewFileGroup+N' .失败! '
         Rollback Tran
     End Catch
 Go

 

 

 

你可能感兴趣的:(移动表到别的文件组,考虑了架构的问题)