杰文
USE MASTER GO IF EXISTS( SELECT * FROM sysobjects WHERE [type] = 'FN' AND [name] = 'kymp_时间转字符' ) BEGIN DROP FUNCTION kymp_时间转字符 END GO CREATE FUNCTION kymp_时间转字符 ( @date DATETIME, --时间 @type VARCHAR(10) --类型 ) RETURNS VARCHAR(4) WITH ENCRYPTION AS BEGIN DECLARE @retdate VARCHAR(4), @today DATETIME SET @retdate = '' SELECT @retdate = CASE RTRIM(LTRIM(@type)) WHEN 'yy' THEN CAST(YEAR(@date) AS VARCHAR(4)) --取年份 WHEN 'mm' THEN --取月份 CASE WHEN MONTH(@date) > 9 THEN CAST(MONTH(@date) AS VARCHAR(2)) ELSE '0' + CAST(MONTH(@date) AS VARCHAR(2)) END WHEN 'dd' THEN --取天数 CASE WHEN DAY(@date) > 9 THEN CAST(DAY(@date) AS VARCHAR(2)) ELSE '0' + CAST(DAY(@date) AS VARCHAR(2)) END WHEN 'hh' THEN --取小时 CASE WHEN DATEPART(hh, @date) > 9 THEN CAST(DATEPART(hh, @date) AS VARCHAR(2)) ELSE '0' + CAST(DATEPART(hh, @date) AS VARCHAR(2)) END WHEN 'nn' THEN --取分 CASE WHEN DATEPART(mi, @date) > 9 THEN CAST(DATEPART(mi, @date) AS VARCHAR(2)) ELSE '0' + CAST(DATEPART(mi, @date) AS VARCHAR(2)) END WHEN 'ss' THEN --取秒 CASE WHEN DATEPART(ss, @date) > 9 THEN CAST(DATEPART(ss, @date) AS VARCHAR(2)) ELSE '0' + CAST(DATEPART(ss, @date) AS VARCHAR(2)) END ELSE '' END RETURN @retdate END GO --select dbo.kymp_时间转字符(getdate(),'ss') GO IF EXISTS( SELECT * FROM sysobjects WHERE [type] = 'P' AND [name] = 'database_backup' ) BEGIN DROP PROCEDURE database_backup END GO CREATE PROCEDURE database_backup @database VARCHAR(1000), --要备份的数据库名称 @database_dir VARCHAR(1000), --备份的目录路径 @ispassword INT, --是否加密压缩文件 1:表示加密,0:表示不加密 默认不加密 @password VARCHAR(16), --解压密码 @output VARCHAR(100) OUTPUT --返回结果 WITH ENCRYPTION AS DECLARE @datefile NVARCHAR(1000), -- 备份数据库的全名:数据库名+时间 @bakfile NVARCHAR(1000), -- 备份文件名 加.bak后缀 @rarfile NVARCHAR(1000), -- 压缩文件名 @rarcmd NVARCHAR(1000) -- shell字符命令 SELECT @database AS 数据库名称, @database_dir AS 备份路径, CASE @ispassword WHEN 1 THEN '加密' WHEN 0 THEN '不加密' END AS 是否加密, @password AS 压缩密码 /* 对各个参数的判断 */ -- 判断数据库 IF (@database IS NULL) OR (@database = '') BEGIN SELECT @output = '备份失败:数据库不能为空' RETURN END -- 判断数据库 ---- 判断密码 IF @ispassword IS NULL BEGIN SET @ispassword = 0 END ELSE IF @ispassword = 1 --- 如果要加密文件,必须给出加密密码 BEGIN IF (@password IS NULL) OR (@password = '') BEGIN SET @output = '备份失败:如果要给压缩的备份文件加密,密码不能为空' RETURN END END ---- 判断密码 ---- 判断路径 IF (@database_dir IS NULL) OR (@database_dir = '') BEGIN SET @output = '备份失败:备份文件路径不能为空' RETURN END ---- 判断路径 /* 对各个参数的判断 */ IF EXISTS( SELECT * FROM sysdatabases WHERE [name] = @database ) BEGIN /* 文件夹路径判断 */ SET @rarcmd = 'dir ' + @database_dir CREATE TABLE #t ( [output] VARCHAR(100) ) INSERT INTO #t EXEC xp_cmdshell @rarcmd -- 执行cmdshell命令,查找路径并把结果插入#t表 IF EXISTS( SELECT * FROM #t WHERE [output] LIKE '%找不到%' )--找不到路径就创建路径 BEGIN SET @rarcmd = 'md ' + @database_dir EXEC xp_cmdshell @rarcmd --- 执行cmdshell命令,创建路径 END SET @rarcmd = 'dir ' + @database_dir ---- 再次判断文件路径是否创建成功(成功的路径不能在系统路径中) DELETE #t INSERT INTO #t EXEC xp_cmdshell @rarcmd --- 执行命令 IF EXISTS( SELECT * FROM #t -- 备份路径不能在系统路径中 WHERE ([output] LIKE '%找不到%') OR ([output] LIKE '%system32%') ) BEGIN DROP TABLE #t SET @output = '备份失败:传入的文件夹路径不对' RETURN END DROP TABLE #t /* 文件夹路径判断 */ /* 备份模块 select getdate()*/ --备份文件名 数据库名+系统当前时间+.bak SET @datefile = @database + '_backup_' + dbo.kymp_时间转字符(GETDATE(), 'yy') + dbo.kymp_时间转字符(GETDATE(), 'mm') + dbo.kymp_时间转字符(GETDATE(), 'dd') + dbo.kymp_时间转字符(GETDATE(), 'hh') + dbo.kymp_时间转字符(GETDATE(), 'nn') + dbo.kymp_时间转字符(GETDATE(), 'ss') SET @bakfile = @database_dir + @datefile + '.bak' SET @rarfile = @database_dir + '' + @datefile + '.rar' --- 压缩的rar文件 BACKUP DATABASE @database TO DISK = @bakfile WITH INIT , NOUNLOAD , NAME = N'HR数据备份', NOSKIP , STATS = 10, NOFORMAT IF @ispassword = 1 --- rar加密处理 BEGIN SET @rarcmd = 'C:\Progra1\WinRAR\WinRAR.exe a -p' + @password + ' -df -ep1 ' + @rarfile + ' ' + @bakfile SET @output = '备份成功:已加密压缩备份文件,密码是:' + @password END ELSE IF @ispassword = 0 --- rar不加密处理 BEGIN SET @output = '备份成功:以不加密的方式压缩了备份文件' SET @rarcmd = 'C:\progra1\WinRAR\WinRAR.exe a -df -ep1 ' + @rarfile + ' ' + @bakfile END /* 备份模块 */ EXEC MASTER..xp_cmdshell @rarcmd --执行cmdshell命令,压缩备份文件 END ELSE BEGIN SELECT @output = '备份失败:没有这个数据库' END GO DECLARE @rt VARCHAR(100) EXEC database_backup 'QQ_data', 'D:1\', 1, '2', @rt OUTPUT SELECT @rt AS 执行结果 GO --sp_helptext database_backup