复制代码 代码如下:
use master
go
declare
@dbname sysname,
@destpath varchar(256)
declare @db table(
name sysname,
physical_name sysname)
begin try
select
@dbname = ‘targetdatabasename’, –input database name
@destpath = ‘d:\sqldata\’ –input destination path
— kill database processes
declare @spid varchar(20)
declare curprocess cursor for
select spid
from sys.sysprocesses
where db_name(dbid) = @dbname
open curprocess
fetch next from curprocess into @spid
while @@fetch_status = 0
begin
exec(‘kill ‘ + @spid)
fetch next from curprocess
end
close curprocess
deallocate curprocess
— query physical name
insert @db(
name,
physical_name)
select
a.name,
a.physical_name
from sys.master_files a
inner join sys.databases b
on a.database_id = b.database_id
and b.name = @dbname
where a.type <=1
–set offline
exec(‘alter database ‘ + @dbname + ‘ set offline’)
–move to dest path
declare
@login_name sysname,
@physical_name sysname,
@temp_name varchar(256)
declare curmove cursor for
select
name,
physical_name
from @db
open curmove
fetch next from curmove into @login_name,@physical_name
while @@fetch_status = 0
begin
set @temp_name = right(@physical_name,charindex(‘\’,reverse(@physical_name)) – 1)
exec(‘exec xp_cmdshell ”move “‘ + @physical_name + ‘” “‘ + @destpath + ‘””’)
exec(‘alter database ‘ + @dbname + ‘ modify file ( name = ‘ + @login_name
+ ‘, filename = ”’ + @destpath + @temp_name + ”’)’)
fetch next from curmove into @login_name,@physical_name
end
close curmove
deallocate curmove
— set online
exec(‘alter database ‘ + @dbname + ‘ set online’)
— show result
select
a.name,
a.physical_name
from sys.master_files a
inner join sys.databases b
on a.database_id = b.database_id
and b.name = @dbname
end try
begin catch
select error_message() as errormessage
end catch
go