在一个数据库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 } ] ]
}
)
[ 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
@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文件已经给删除