zoukankan      html  css  js  c++  java
  • SQL端通过脚本判断文件夹是否存在 并创建

    做数据库备份作业的时候..想按日期建立文件夹.. 

    首先要判断文件夹是否存在

    DECLARE @PATH VARCHAR(255)  --路径
    DECLARE @DATE VARCHAR(255)  --日期 例如: 20171011
    SET @DATE=CAST(DATEPART(YYYY,GETDATE()) AS VARCHAR)+CAST(DATEPART(MM,GETDATE()) AS VARCHAR)+CAST(DATEPART(DD,GETDATE()) AS VARCHAR)
    SET @PATH = 'E:SQL2012_BAK'+@DATE+''
    DECLARE @TEMP TABLE(A INT,B INT,C INT) --建立一个虚拟表 用来判断文件夹是否存在
    INSERT @TEMP EXEC [MASTER]..XP_FILEEXIST @PATH
    IF NOT EXISTS(SELECT * FROM @TEMP WHERE B=1) 
    BEGIN
        --因为XP_CMDSHELL 函数的参数不允许使用变量拼接  所以使用EXEC(SQL)的方法
        DECLARE @EX NVARCHAR(255)
        SET @EX='EXEC XP_CMDSHELL ''MKDIR '+@PATH+''''
        EXEC(@EX)
    END

    如果报错

    消息 15281,级别 16,状态 1,过程 xp_cmdshell,第 1SQL Server 阻止了对组件“xp_cmdshell”的 过程“sys.xp_cmdshell”的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。

    则使用以下修改配置项包裹以上脚本

    --开启 XP_CMDSHELL 
    GO
    SP_CONFIGURE 'SHOW ADVANCED OPTIONS',1
    RECONFIGURE
    GO
    SP_CONFIGURE 'XP_CMDSHELL',1
    RECONFIGURE
    GO
    
    
    //===================
    
    此处为使用了 XP_CMDSHELL 的脚本
    
    //===================
    
    
    --关闭 XP_CMDSHELL 
    GO
    SP_CONFIGURE 'XP_CMDSHELL',0
    RECONFIGURE
    GO
    SP_CONFIGURE 'SHOW ADVANCED OPTIONS',0
    RECONFIGURE
    GO

    最后贴上数据库备份命令

    --备份数据库
    --此处可以放置多个数据库的备份 不必和定制作业步骤时选择的库是同一个
    DECLARE @BAKFILE NVARCHAR(255)
    SET @BAKFILE = @PATH+@DATE+'.DB1.BAK'
    BACKUP DATABASE [DB1] TO DISK = @BAKFILE WITH COMPRESSION    
    SET @BAKFILE = @PATH+@DATE+'.DB2.BAK'
    BACKUP DATABASE [DB2] TO DISK = @BAKFILE WITH COMPRESSION

    综上所述, 最终版的SQL备份命令是: (展开查看)

    ---------------------------
    --开启 XP_CMDSHELL 
    ---------------------------
    GO
    SP_CONFIGURE 'SHOW ADVANCED OPTIONS',1
    RECONFIGURE
    GO
    SP_CONFIGURE 'XP_CMDSHELL',1
    RECONFIGURE
    GO
    
    ---------------------------
    --检查文件夹是否存在 不存在则创建
    ---------------------------
    DECLARE @PATH VARCHAR(255)  --路径
    DECLARE @DATE VARCHAR(255)  --日期 例如: 20171011
    SET @DATE=CAST(DATEPART(YYYY,GETDATE()) AS VARCHAR)+CAST(DATEPART(MM,GETDATE()) AS VARCHAR)+CAST(DATEPART(DD,GETDATE()) AS VARCHAR)
    SET @PATH = 'E:SQL2012_BAK'+@DATE+''
    DECLARE @TEMP TABLE(A INT,B INT,C INT) --建立一个虚拟表 用来判断文件夹是否存在
    INSERT @TEMP EXEC [MASTER]..XP_FILEEXIST @PATH
    IF NOT EXISTS(SELECT * FROM @TEMP WHERE B=1) 
    BEGIN
        --因为XP_CMDSHELL 函数的参数不允许使用变量拼接  所以使用EXEC(SQL)的方法
        DECLARE @EX NVARCHAR(255)
        SET @EX='EXEC XP_CMDSHELL ''MKDIR '+@PATH+''''
        EXEC(@EX)
    END 
    
    
    ---------------------------
    --备份数据库
    ---------------------------
    DECLARE @BAKFILE NVARCHAR(255)
    SET @BAKFILE = @PATH+@DATE+'.DB1.BAK'
    BACKUP DATABASE [DB1] TO DISK = @BAKFILE WITH COMPRESSION    
    SET @BAKFILE = @PATH+@DATE+'.DB2.BAK'
    BACKUP DATABASE [DB2] TO DISK = @BAKFILE WITH COMPRESSION
    
    ---------------------------
    --关闭 XP_CMDSHELL 
    ---------------------------
    GO
    SP_CONFIGURE 'XP_CMDSHELL',0
    RECONFIGURE
    GO
    SP_CONFIGURE 'SHOW ADVANCED OPTIONS',0
    RECONFIGURE
    GO
    View Code
  • 相关阅读:
    并发编程之多线程(理论部分)
    基于TCP和UDP的socket
    ajax笔记 显示出所城市名称 ShowCity.aspx Html代码
    蒸饭的纱布
    ajax 笔记--不刷新实现简单的留言版 guestBook
    从表的第几条取到第几条记录
    在asp.net添加数据到XML里去
    ajax 笔记-- 写了一个不用刷新就能实现--用户名验证的例子
    今天生日
    ajax 笔记不用刷新实现数据的分页显示
  • 原文地址:https://www.cnblogs.com/iiwen/p/7650118.html
Copyright © 2011-2022 走看看