• 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
  • 相关阅读:
    输出菱形
    for语句输出三角形
    阶乘倒数的和
    变量赋值判断奇偶
    928作业
    各种主流数据库的比较(所以说我觉得Oracle这个keng?入的不错?)
    Oracle创建表
    (转载)全球唯一标识GUID
    (转载)Java基础知识总结
    两天以来对plsqldev操作的记忆
  • 原文地址:https://www.cnblogs.com/iiwen/p/7650118.html
Copyright © 2020-2023  润新知