SQL语句实现移动数据库文件



看csdn上看到一朋友写了一个《 贴个SQL小工具--移动数据库物理文件
http://topic.csdn.net/u/20080712/16/5c738254-f93e-4623-a666-e7f753dbdb58.html?seed=1415079037
使用是方法是先设置数据库脱机,再移动数据库文件,然后修改数据库的存储文件路径,最后再设置数据库联机。

这里我写的使用的是,先分离数据库,再移动数据库文件,然后再附加新数据库文件的方法:


Use  master
Go
If   Object_id ( ' sp_MoveDB ' , ' P ' Is   Not   null
    
Drop   Proc  sp_MoveDB 
Go
Create   Proc  sp_MoveDB
(
    
@DataBase  sysname,
    
@PathTo   nvarchar ( 1024 )
)
As
Declare  
    
@Sql   nvarchar ( max ),
    
@AttachDatabase   nvarchar ( max ),
    
@Error   nvarchar ( 1024 ),
    
@Dir   varchar ( 1024 ),
    
@ok   int

If   db_id ( @DataBase Is   null
Begin
    
Set   @Error = ' 错误的数据库名:  ' + @DataBase
    
Raiserror   50001   @Error
    
Return  
End

Set   @Dir = ' Dir  ' + @PathTo
Exec   @ok = xp_cmdshell  @Dir ,No_output
If   @ok <> 0
Begin
    
Set   @Error = ' 错误的文件路径:  ' + @PathTo
    
Raiserror   50001   @Error
    
Return  
End

Select   @DataBase = name  From  sys.databases  Where  name = @DataBase  

Print   ' 数据库:  ' + @DataBase + Char ( 13 ) + Char ( 10 ) + ' 正在移动数据库文件,请稍候  '
Select   @Sql = Isnull ( @Sql + Char ( 13 ) + Char ( 10 ), '' ) + ' Kill  ' + Rtrim (spid)  From  sys.sysprocesses  Where    db_name (dbid) = @DataBase
Exec  ( @Sql )

Set   @Sql = null
Select  
    
@Sql = Isnull ( @Sql + Char ( 13 ) + Char ( 10 ), '' ) + ' Exec xp_cmdshell  '' Move  ' + physical_name + Char ( 32 ) + @PathTo +Right (physical_name, Charindex ( ' \ ' , Reverse (physical_name))) + ''' ,No_output ' ,
    
@AttachDatabase = Isnull ( @AttachDatabase + ' , ' , ' Create Database  ' + Quotename ( @DataBase ) + '  On  ' ) + ' (Filename= ''' + @PathTo +Right (physical_name, Charindex ( ' \ ' , Reverse (physical_name))) + ''' ) '
From  sys.master_files  Where  database_id = db_id ( @DataBase )
Set   @Sql = ' Exec sp_detach_db  ' + Quotename ( @DataBase ) + Char ( 13 ) + Char ( 10 ) + @Sql + Char ( 13 ) + Char ( 10 ) + @AttachDatabase + '  For Attach '
Exec ( @Sql )

If   @@Error = 0  
    
Print   ' 完成移动数据库文件. '
Else
    
Print   ' 移动数据库文件失败. '  



test:

Exec sp_MoveDB 'test1' ,'F:\SQL2005\test'

/*
数据库: test1
正在移动数据库文件,请稍候... ...
完成移动数据库文件.

*/

--移动所有的用户数据库文件如下:

Declare   @sql   nvarchar ( max )
Declare   @Path   nvarchar ( 1024 )
Set   @Path = ' F:\SQL2005\test '

Select   @sql = Isnull ( @sql + Char ( 13 ) + Char ( 10 ), '' ) + ' Exec sp_MoveDB  ' + Quotename (name)  + ' , ''' + @Path + ''''
From  sys.databases  where  name  Not   in ( ' master ' , ' model ' , ' msdb ' , ' tempdb ' , ' ReportServer ' , ' ReportServerTempDB ' )
Exec  ( @sql )

/*
数据库: deadlocktest
正在移动数据库文件,请稍候 
完成移动数据库文件.
数据库: test1
正在移动数据库文件,请稍候 
完成移动数据库文件.

*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值