根據當月資料庫自動生成下個月資料庫 1

2021-08-21 23:29:40 字數 3476 閱讀 7924

--*/

/*--處理要求

在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...