--*/
/*--處理要求
在sql資料庫裡有乙個名為pos200502的database,每個月會有乙個類似於這樣名稱(pos200502 pos200503)的database
我該如何利用sql server的自動作業+一段儲存過程,實現以下功能:
1.每個月的25號,自動建立乙個下乙個月的database,database名字定為:posyyyymm (yyyymm是年和月,始終是執行操作時間的下乙個月)
2.再將本月database的所有結構(包括表、檢視、儲存過程等)一模一樣的複製到下乙個月的database中。(注意僅複製結構,不複製任何資料!)
--*/
---方法1. 備份+恢復
use master
goif exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[sp_proccopydb]') and objectproperty(id, n'isprocedure') = 1)
drop procedure [dbo].[sp_proccopydb]
go/*--資料庫自動複製
將指定前緣的資料庫,複製為乙個以當前月份+1為庫名的資料庫中,並且清除所有的資料
例如,資料庫前緣為 pos ,當前日期為 2005-3-27
則要求複製資料 pos200503 為 pos200504,並且清空裡面的資料
用備份+恢復的方法實現
好處是在清理資料時,可以設定條件,保留指定的資料
不好的地方是資料多時,速度慢,消耗的資源多
--鄒建 2005.03(引用請保留此資訊)--*/
/*--呼叫示例
-- 複製 pos
exec sp_proccopydb 'pos'
--*/
create proc sp_proccopydb
@db_head sysname=n'' --資料庫字首
asdeclare @sdbname sysname,@ddbname sysname
declare @s nvarchar(4000),@bkfile nvarchar(1000),@move nvarchar(4000)
--複製的源庫名及目標庫名
if @db_head is null set @db_head=n''
select @sdbname=@db_head+convert(char(6),getdate(),112),
@ddbname=@db_head+convert(char(6),dateadd(month,1,getdate()),112)
if db_id(@sdbname) is null
begin
raiserror(n'源資料庫"%s"不存在',1,16,@sdbname)
return
endif 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
--還原為目標資料庫
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
--清理目標資料庫中的所有資料
set @s=n'
use '+quotename(@ddbname)+n'
exec sp_msforeachtable
@command1=n''truncate table ?'',
@whereand=n'' and objectproperty(o.id,n''''tablehasforeignref'''')=0''
exec sp_msforeachtable
@command1=n''delete from ?'',
@whereand=n'' and objectproperty(o.id,n''''tablehasforeignref'''')=1''
'exec sp_executesql @s
go
根據當月資料庫自動生成下個月資料庫 2
方法2.指令碼複製 use master goif exists select from dbo.sysobjects where id object id n dbo sp proccopydb and objectproperty id,n isprocedure 1 drop procedur...
根據當月資料庫自動生成下個月資料庫 2
方法2.指令碼複製 use master goif exists select from dbo.sysobjects where id object id n dbo sp proccopydb and objectproperty id,n isprocedure 1 drop procedur...
根據當月資料庫自動生成下個月資料庫 3
建立乙個每月最後乙個工作日執行的作業,呼叫上述儲存過程實現自動建立資料庫 use master go 設定 sql agent 服務為自動啟動 exec msdb.sp set sqlagent properties auto start 1 go 建立作業 exec msdb.sp add job...