杰文

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(@dateAS VARCHAR(4)) --取年份
                      WHEN 'mm' THEN --取月份
                           CASE 
                                
WHEN MONTH(@date> 9 THEN CAST(MONTH(@dateAS VARCHAR(2))
                                
ELSE '0' + CAST(MONTH(@dateAS VARCHAR(2))
                           
END
                      
WHEN 'dd' THEN --取天数
                           CASE 
                                
WHEN DAY(@date> 9 THEN CAST(DAY(@dateAS VARCHAR(2))
                                
ELSE '0' + CAST(DAY(@dateAS VARCHAR(2))
                           
END
                      
WHEN 'hh' THEN --取小时
                           CASE 
                                
WHEN DATEPART(hh, @date> 9 THEN CAST(DATEPART(hh, @dateAS VARCHAR(2))
                                
ELSE '0' + CAST(DATEPART(hh, @dateAS VARCHAR(2))
                           
END
                      
WHEN 'nn' THEN --取分
                           CASE 
                                
WHEN DATEPART(mi, @date> 9 THEN CAST(DATEPART(mi, @dateAS VARCHAR(2))
                                
ELSE '0' + CAST(DATEPART(mi, @dateAS VARCHAR(2))
                           
END
                      
WHEN 'ss' THEN --取秒
                           CASE 
                                
WHEN DATEPART(ss, @date> 9 THEN CAST(DATEPART(ss, @dateAS VARCHAR(2))
                                
ELSE '0' + CAST(DATEPART(ss, @dateAS 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 NULLOR (@database = '')
BEGIN
   
SELECT @output = '备份失败:数据库不能为空'
   
RETURN
END
-- 判断数据库
--
--   判断密码
IF @ispassword IS NULL
BEGIN
   
SET @ispassword = 0
END
ELSE 
IF @ispassword = 1 --- 如果要加密文件,必须给出加密密码
BEGIN
   
IF (@password IS NULLOR (@password = '')
   
BEGIN
       
SET @output = '备份失败:如果要给压缩的备份文件加密,密码不能为空'
       
RETURN
   
END
END
----   判断密码
--
-- 判断路径
IF (@database_dir IS NULLOR (@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
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值