一个数据库EmployeeManagement中有一个主要数据库文件EmployeeManagement.mdf和两个次要数据库文件rt.ndf、YU.ndf,还有一个事务日志文件EmployeeManagement_log.ldf。
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> Use EmployeeManagement
Go
Set Nocount On
Declare @DBFile1 nvarchar ( 512 ),
@DBFile2 nvarchar ( 512 ),
@Sql nvarchar ( 4000 )
Set @DBFile1 = ' RT '
Set @DBFile2 = ' YU '
If Not Exists ( Select 1 From sys.sysfiles Where name = @DBFile1 )
Begin
Set @Sql = @DBFile1 + N ' 数据库文件不存在或已删除! '
Raiserror 50001 @sql
Goto ExitFlag
End
If Not Exists ( Select 1 From sys.sysfiles Where name = @DBFile2 )
Begin
Set @Sql = @DBFile2 + N ' 数据库文件不存在或已删除! '
Raiserror 50001 @sql
Goto ExitFlag
End
If object_id ( ' tempdb..# ' ) Is Not Null
Drop Table #
Create Table #(Rows int )
Set @sql = Null
Select @sql = Isnull ( @sql + Char ( 13 ) + Char ( 10 ), '' ) + ' Insert Into # Select Count(*) From ' + Quotename (name)
From sys.objects
Where type = ' U '
If @sql > '' Exec ( @sql )
Select Sum (Rows) As [ 合并数据库文件前的所有表记录数 ] From #
Dbcc Shrinkfile( @DBFile1 ,Emptyfile) With No_Infomsgs
Exec (N ' Alter Database EmployeeManagement Remove File ' + @DBFile1 )
Dbcc Shrinkfile( @DBFile2 ,Emptyfile) With No_Infomsgs
Exec (N ' Alter Database EmployeeManagement Remove File ' + @DBFile2 )
Truncate Table #
Set @sql = Null
Select @sql = Isnull ( @sql + Char ( 13 ) + Char ( 10 ), '' ) + ' Insert Into # Select Count(*) From ' + Quotename (name)
From sys.objects
Where type = ' U '
If @sql > '' Exec ( @sql )
Select Sum (Rows) As [ 合并数据库文件后的所有表记录数 ] From #
ExitFlag:
如图1:
现在想把 rt.ndf、YU.ndf里面的数据合并到EmployeeManagement.mdf。
这里使用的是收缩数据库文件的方法达到合并数据库文件的目的。
收缩数据库文件命令:
DBCC SHRINKFILE ( { 'file_name' | file_id } { [ , EMPTYFILE ] | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ] } ) [ WITH NO_INFOMSGS ]这里提供一个参数EMPTYFILE 的说明:
EMPTYFILE将指定文件中的所有数据迁移到同一文件组中的其他文件。SQL Server 2005 Database Engine 不允许将数据放在用于 EMPTYFILE 选项的文件上。该选项允许使用 ALTER DATABASE 删除文件。
意思是说先执行收缩命令:Dbcc Shrinkfile(文件名,Emptyfile)
再执行删除数据库文件命令:Alter Database 数据库名 Remove File 文件名
下面我们做一个测试:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> Use EmployeeManagement
Go
Set Nocount On
Declare @DBFile1 nvarchar ( 512 ),
@DBFile2 nvarchar ( 512 ),
@Sql nvarchar ( 4000 )
Set @DBFile1 = ' RT '
Set @DBFile2 = ' YU '
If Not Exists ( Select 1 From sys.sysfiles Where name = @DBFile1 )
Begin
Set @Sql = @DBFile1 + N ' 数据库文件不存在或已删除! '
Raiserror 50001 @sql
Goto ExitFlag
End
If Not Exists ( Select 1 From sys.sysfiles Where name = @DBFile2 )
Begin
Set @Sql = @DBFile2 + N ' 数据库文件不存在或已删除! '
Raiserror 50001 @sql
Goto ExitFlag
End
If object_id ( ' tempdb..# ' ) Is Not Null
Drop Table #
Create Table #(Rows int )
Set @sql = Null
Select @sql = Isnull ( @sql + Char ( 13 ) + Char ( 10 ), '' ) + ' Insert Into # Select Count(*) From ' + Quotename (name)
From sys.objects
Where type = ' U '
If @sql > '' Exec ( @sql )
Select Sum (Rows) As [ 合并数据库文件前的所有表记录数 ] From #
Dbcc Shrinkfile( @DBFile1 ,Emptyfile) With No_Infomsgs
Exec (N ' Alter Database EmployeeManagement Remove File ' + @DBFile1 )
Dbcc Shrinkfile( @DBFile2 ,Emptyfile) With No_Infomsgs
Exec (N ' Alter Database EmployeeManagement Remove File ' + @DBFile2 )
Truncate Table #
Set @sql = Null
Select @sql = Isnull ( @sql + Char ( 13 ) + Char ( 10 ), '' ) + ' Insert Into # Select Count(*) From ' + Quotename (name)
From sys.objects
Where type = ' U '
If @sql > '' Exec ( @sql )
Select Sum (Rows) As [ 合并数据库文件后的所有表记录数 ] From #
ExitFlag:
执行后如图:
执行ok,通过统计数据库中的表总记录数是否一致,来达到检查在数据库文件变动前后表数据是否丢失。
统计表记录数,只是简单的检查方法;还可以通过备份还原与它相同的另一个数据库作比较,看数据是否一致。
测试好后,我们可以看到rt.ndf、YU.ndf文件已经给删除
http://www.cnblogs.com/wghao/archive/2009/05/15/1457192.html