如何合并数据库⽂件(合并多个ndf)
在⼀个数据库EmployeeManagement中有⼀个主要数据库⽂件EmployeeManagement.mdf和两个次要数据库⽂件rt.ndf、YU.ndf,还有⼀个事务⽇志⽂件EmployeeManagement_log.ldf。
如图1:
现在想把 rt.ndf、YU.ndf⾥⾯的数据合并到EmployeeManagement.mdf。
这⾥使⽤的是收缩数据库⽂件的⽅法达到合并数据库⽂件的⽬的。
收缩数据库⽂件命令:
DBCC SHRINKFILE
(
{ 'file_name' | file_id }
{ [ , EMPTYFILE ]
| [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ]
}
)
truncate的意思[ WITH NO_INFOMSGS ]
这⾥提供⼀个参数EMPTYFILE 的说明:
EMPTYFILE
将指定⽂件中的所有数据迁移到同⼀⽂件组中的其他⽂件。SQL Server 2005 Database Engine 不允许将数据放在⽤于 EMPTYFILE 选项的⽂件上。该选项允许使⽤ ALTER DATABASE 删除⽂件。
意思是说先执⾏收缩命令:Dbcc Shrinkfile(⽂件名,Emptyfile)
再执⾏删除数据库⽂件命令:Alter Database 数据库名 Remove File ⽂件名
下⾯我们做⼀个测试:
Use EmployeeManagement
Go
Set Nocount On
Declare@DBFile1nvarchar(512),
@DBFile2nvarchar(512),
@Sql nvarchar(4000)
Set@DBFile1='RT'
Set@DBFile2='YU'
If Not Exists(Select1From sys.sysfiles Where name=@DBFile1)
Begin
Set@Sql=@DBFile1+ N' 数据库⽂件不存在或已删除!'
Raiserror50001@sql
Goto ExitFlag
End
If Not Exists(Select1From sys.sysfiles Where name=@DBFile2)
Begin
Set@Sql=@DBFile2+ N' 数据库⽂件不存在或已删除!'
Raiserror50001@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⽂件已经给删除

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。