zoukankan      html  css  js  c++  java
  • 杰文

    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
  • 相关阅读:
    iOS开发UIKit框架-可视化编程-XIB
    ios swift例子源码网址总结
    两个单链表相交问题
    库函数atoi
    C++类型萃取
    【Swift】iOS导航栏错乱的原因
    【Swift】iOS裁剪或者压缩后出现的白边问题
    Linux进程调度分析
    【scala】可变与不可变的理解
    【scala】模式匹配
  • 原文地址:https://www.cnblogs.com/zengxiangzhan/p/1684929.html
Copyright © 2011-2022 走看看