if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_CopyDb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[p_CopyDb] GO
--得到要复制的数据库名 if isnull(@sdbname,'')='' set @sdbname=db_name()
--得到临时备份数据目录及文件名 select @bpath=rtrim(reverse(filename)) from master..sysfiles where name='master' select @bpath=substring(@bpath,charindex('\',@bpath)+1,8000) ,@bpath=reverse(substring(@bpath,charindex('\',@bpath),8000))+'BACKUP\' +@sdbname+'_'+convert(varchar,getdate(),112) +'_'+replace(convert(varchar,getdate(),108),':','') +'.bak'
--生成数据库备份语句,进行数据库备份 set @sql='backup database '+@sdbname +' to disk='''+@bpath +''' with NOINIT' exec(@sql)
--根据备份文件恢复成新的数据库(完成复制工作) set @sql='restore database '+@ddbname +' from disk='''+@bpath+'''' +' with file=1' +case when @overexist=1 then ',replace' else '' end
--得到数据库存放的默认目录 --得到SQL安装时设置的数据文件路径 select @rpath=rtrim(reverse(filename)) from master..sysfiles where name='master' select @rpath=reverse(substring(@rpath,charindex('\',@rpath),8000))
--添加移动逻辑文件的处理 --从备份文件中获取逻辑文件名 declare @lfn nvarchar(128),@tp char(1),@i int
--创建临时表,保存获取的信息 create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0)) --从备份文件中获取信息 insert into #tb exec('restore filelistonly from disk='''+@bpath+'''') declare #f cursor for select ln,tp from #tb open #f fetch next from #f into @lfn,@tp set @i=0 while @@fetch_status=0 begin select @sql=@sql+',move '''+@lfn+''' to '''+@rpath+@ddbname+cast(@i as varchar) +case @tp when 'D' then '.mdf''' else '.ldf''' end ,@i=@i+1 fetch next from #f into @lfn,@tp end close #f deallocate #f
--关闭用户进程处理 if @overexist=1 and @killuser=1 begin declare @spid varchar(20) declare #spid cursor for select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@ddbname) open #spid fetch next from #spid into @spid while @@fetch_status=0 begin exec('kill '+@spid) fetch next from #spid into @spid end close #spid deallocate #spid end
--恢复数据库 exec(@sql)
--删除备份的临时文件 set @sql='del "'+@bpath+'"' exec master..xp_cmdshell @sql,no_output select @sql,@bpath,@rpath go
http://topic.csdn.net/t/20031224/09/2596576.html
/*--
研究了一整天,终于找到了解决的办法.
用下面的存储过程,将你的数据库复制一下,就可以解决问题了.
--用法:
打开查询分析器,将下面的代码复制到查询分析器中,按F5执行.
--然后执行下面的语句来调用:
exec p_CopyDb @sdbname='要删除强制订阅的数据库'
,@ddbname='删除强制订阅后生成的数据库名'
--*/
/*--将一个数据库完整复制成另一个数据库
--邹建 2003.10--*/
/*--调用示例
exec p_CopyDb @sdbname='要删除强制订阅的数据库'
,@ddbname='test'
--*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_CopyDb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_CopyDb]
GO
create proc p_CopyDb
@sdbname sysname='', --定义要复制的数据库名,默认为当前数据库
@ddbname sysname, --定义复制后生成的数据库名
@overexist bit=1, --是否覆盖已经存在的数据库
@killuser bit=1 --是否关闭用户使用进程,仅@overexist=1时有效
as
declare @sql varchar(8000),@bpath varchar(8000),@rpath varchar(8000)
--得到要复制的数据库名
if isnull(@sdbname,'')='' set @sdbname=db_name()
--得到临时备份数据目录及文件名
select @bpath=rtrim(reverse(filename)) from master..sysfiles where name='master'
select @bpath=substring(@bpath,charindex('\',@bpath)+1,8000)
,@bpath=reverse(substring(@bpath,charindex('\',@bpath),8000))+'BACKUP\'
+@sdbname+'_'+convert(varchar,getdate(),112)
+'_'+replace(convert(varchar,getdate(),108),':','')
+'.bak'
--生成数据库备份语句,进行数据库备份
set @sql='backup database '+@sdbname
+' to disk='''+@bpath
+''' with NOINIT'
exec(@sql)
--根据备份文件恢复成新的数据库(完成复制工作)
set @sql='restore database '+@ddbname
+' from disk='''+@bpath+''''
+' with file=1'
+case when @overexist=1 then ',replace' else '' end
--得到数据库存放的默认目录
--得到SQL安装时设置的数据文件路径
select @rpath=rtrim(reverse(filename)) from master..sysfiles where name='master'
select @rpath=reverse(substring(@rpath,charindex('\',@rpath),8000))
--添加移动逻辑文件的处理
--从备份文件中获取逻辑文件名
declare @lfn nvarchar(128),@tp char(1),@i int
--创建临时表,保存获取的信息
create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))
--从备份文件中获取信息
insert into #tb exec('restore filelistonly from disk='''+@bpath+'''')
declare #f cursor for select ln,tp from #tb
open #f
fetch next from #f into @lfn,@tp
set @i=0
while @@fetch_status=0
begin
select @sql=@sql+',move '''+@lfn+''' to '''+@rpath+@ddbname+cast(@i as varchar)
+case @tp when 'D' then '.mdf''' else '.ldf''' end
,@i=@i+1
fetch next from #f into @lfn,@tp
end
close #f
deallocate #f
--关闭用户进程处理
if @overexist=1 and @killuser=1
begin
declare @spid varchar(20)
declare #spid cursor for
select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@ddbname)
open #spid
fetch next from #spid into @spid
while @@fetch_status=0
begin
exec('kill '+@spid)
fetch next from #spid into @spid
end
close #spid
deallocate #spid
end
--恢复数据库
exec(@sql)
--删除备份的临时文件
set @sql='del "'+@bpath+'"'
exec master..xp_cmdshell @sql,no_output
select @sql,@bpath,@rpath
go
执行系统存储过程 sp_removedbrepliction 'database name'
建了一个测试用数据库,模拟当前条件,执行时未出错。在正式
数据库上执行报告任务完成,但有错误,但目的实现