複製資料庫
sql200企業管理器
--右鍵要複製的資料庫a
--所有任務
--匯出資料
--目標資料庫,選擇資料庫b
--然後選擇"在sql server資料庫之間複製資料和物件"
--勾選"建立目的物件","包含擴充套件屬性"
--最後完成.
或者查詢分析器執行下面的語句建立乙個儲存過程,然後再執行呼叫示例中的呼叫方法實現資料庫複製
use master
goif 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/*--將乙個資料庫完整複製成另乙個資料庫
借助備份/恢復,將源資料庫複製為目標資料庫
--鄒建 2003.10(引用請保留此資訊)--*/
/*--呼叫示例
exec p_copydb @sdbname=n'pubs'
--*/
create proc p_copydb
@sdbname sysname=n'', --定義要複製的資料庫名,預設為當前資料庫
@ddbname sysname=n'', --定義複製後生成的資料庫名,預設為當前資料庫名+_bak
@overexist bit=1, --是否覆蓋已經存在的資料庫
@killuser bit=1 --是否關閉使用者使用程序,僅@overexist=1時有效
asdeclare @s nvarchar(4000),@bkfile nvarchar(1000),@move nvarchar(4000)
--引數檢查
if @overexist is null set @overexist=0
if @killuser is null set @killuser=0
--檢查複製的源庫名
if isnull(@sdbname,n'')=n''
set @sdbname=db_name()
else if db_id(@sdbname) is null
begin
raiserror(n'資料庫"%s"無效',1,16,@sdbname)
return
end--檢查目標資料庫
if isnull(@ddbname,n'')=''
set @ddbname=@sdbname+n'_bak'
if @overexist=0 and db_id(@ddbname) is not null
begin
raiserror(n'目標資料庫"%s"已經存在',1,16,@ddbname)
return
end--臨時備份檔案名
select top 1 @bkfile=rtrim(reverse(filename))
from master.dbo.sysfiles
where name=n'master'
select @bkfile=stuff(@bkfile,1,charindex('/',@bkfile),n'')
,@bkfile=reverse(stuff(@bkfile,1,charindex('/',@bkfile),n''))
+n'/backup/'+cast(newid() as nvarchar(36))+n'.bak'
--資料檔案移動語句
set @s=n'set @move=n''''
select @move=@move
+n'',move ''+quotename(rtrim(name),n'''''''')
+n'' to ''+quotename(rtrim(case
when charindex(n'
+quotename(@sdbname,n'''')
+n',filename)>0
then stuff(filename,charindex(n'
+quotename(@sdbname,n'''')
+n',filename),'
+cast(len(@sdbname) as nvarchar)
+n',n'+quotename(@ddbname,n'''')+n')
else reverse(stuff(
reverse(filename),
charindex(''/'',reverse(filename)),
0,+n''_''+reverse(n'+quotename(@ddbname,n'''')+n')))
end),n'''''''')
from '+quotename(@sdbname)+n'.dbo.sysfiles'
exec sp_executesql @s,n'@move nvarchar(4000) out',@move out
--備份源資料庫
set @s=n'backup database '+quotename(@sdbname)+n' to disk=@bkfile with format'
exec sp_executesql @s,n'@bkfile nvarchar(1000)',@bkfile
--如果需要,做關閉使用者程序處理
if @killuser=1 and db_id(@ddbname) is not null
begin
declare tb cursor local
for
select n'kill '+cast(spid as varchar)
from master.dbo.sysprocesses
where dbid=db_id(@ddbname)
open tb
fetch tb into @s
while @@fetch_status=0
begin
exec sp_executesql @s
fetch tb into @s
end
close tb
deallocate tb
end--還原為目標資料庫
set @s=n'restore database '
+quotename(@ddbname)
+n' from disk=@bkfile with replace'
+@move
exec sp_executesql @s,n'@bkfile nvarchar(1000)',@bkfile
--刪除臨時備份檔案
set @s='del "'+@bkfile+'"'
exec master..xp_cmdshell @s,no_output
go注意兩種方法
第一種方法,如果不勾選建立目的物件,則適合於資料庫b已經建立好,只需要複製資料的情況
否則1,2種方法都是把資料庫a完全(包括檢視等...)複製到資料庫b,結果是兩個資料庫完全一樣
資料庫複製
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 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 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 資料庫資料複製 將乙...