这是CSDN SQL Server 版主邹建的SQL笔记

源代码在线查看: 年度结转的存储过程.sql

软件大小: 277 K
上传用户: wanghao891207
关键词: SQL Server CSDN
下载地址: 免注册下载 普通下载 VIP

相关代码

				/*--年度结转的示例存储过程
					
					将当前数据库的数据复制到一个新的数据库做为备份
					同时根据数据结构表清除旧年的数据
				邹建 2003.08--*/
				
				/*--调用示例
				
				exec p_年结 '2002'
				--*/
				if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_年结]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
				drop procedure [dbo].[p_年结]
				GO
				
				create proc p_年结
				@年份 varchar(4)		--年结的年份(生成的新数据库的后缀)
				as
				declare @sql varchar(8000)
				
				/*--数据库复制处理--开始--*/
				declare @phyfname varchar(1000),@dbname varchar(250),@ndbname varchar(250)
				
				select @dbname=db_name(),@ndbname=@dbname+'_'+@年份
				
				--得到SQL安装时的数据文件路径
				select @phyfname=rtrim(reverse(filename)) from master..sysfiles where name='master'
				select @phyfname=reverse(substring(@phyfname,charindex('\',@phyfname),8000))
					,@phyfname=@phyfname+@dbname+'_'+convert(varchar(10),getdate(),112)+'_temp.bak'
				
				--备份数据库
				set @sql='backup database '+@dbname+'
					to disk='''+@phyfname+''' with init'
				exec(@sql)
				
				--生成新数据库
				set @sql='restore database '+@ndbname+'
					from disk='''+@phyfname+'''
					with '
				select @sql=@sql+'move '''+rtrim(lname)
					+''' to '''+rtrim(pname)+''','
				from (select lname=cast(name as varchar)
						,pname=cast(stuff(filename
							,len(filename)-charindex('\',ltrim(reverse(filename)))+2
							,len(@dbname),@ndbname) as varchar)
						from sysfiles
				) a
				
				set @sql=left(@sql,len(@sql)-1)
				exec(@sql)
				
				--删除临时备份文件
				set @sql='del "'+@phyfname+'"'
				exec master..xp_cmdshell @sql
				
				/*--数据库复制处理--结束--*/
				
				
				/*--删除旧年数据--开始--*/
				declare @tbname varchar(250)
				
				--定义数据清理的游标
				--如果有专门表保存要清理的表和清理顺序,则直接根据此表定义游标
				declare #tb cursor for
					select name from sysobjects where objectproperty(id,'IsUserTable')=1
				
				--打开游标,循环读取以清理旧年数据
				open #tb
				fetch next from #tb into @tbname
				while @@fetch_status=0
				begin
					--清理表中的数据
					set @sql='delete from ['+@tbname+']'
					exec(@sql)
				
					--如果表含有标识列,将它重新初始化
					if exists(select 1 from syscolumns where object_id(@tbname)=id and status=0x80)
						DBCC CHECKIDENT (@tbname, RESEED, 1)
					fetch next from #tb into @tbname
				end
				close #tb
				deallocate #tb
				/*--删除旧年数据--结束--*/
				go
				
							

相关资源