SQL端通过脚本判断文件夹是否存在 并创建

Posted 代码工人有力量

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于SQL端通过脚本判断文件夹是否存在 并创建的主要内容,如果未能解决你的问题,请参考以下文章

Linux脚本实现判断文件/目录是否存在

SQL-创建表之前判断表是否存在

Shell脚本判断文件是不是存在

要在一台主机上执行shell脚本判断另一台上的某个文件是不是存在,这个shell语句该怎么写?

kettle 6.1 通过JS脚本与SwitchCase结合实现数据流选择

求Bash Shell脚本,判定文件是不是存在。