SQL扫描并执行文件夹里的sql脚本

原文:SQL扫描并执行文件夹里的sql脚本

场景:项目数据库操作全部使用存储过程实现。每天都会有很多存储过程更新/增加,人工对测试环境中存储过程更新,会有一定概率出现遗漏,也麻烦!所以,需要一个工具将文件夹中所有存         储过程执行一次。
实现:首先想到的是用c#,很简单,而且功能强大。
        但是,我想尝试一下使用sql实现同样的功能,然后就发现了xp_cmdshell这个强大而又危险的东西!查询分析器执行,无需传入数据库用户名、密码,传入目录,就会按照脚本文件名排         序执行 (感谢@OK_008提醒有些情况是需要按顺序执行的。)。
原理:利用xp_cmdshell扩展存储过程将命令字符串作为操作系统命令 shell 执行,并以文本行的形式返回所有输出。实现扫描文件夹,并执行存储过程。
未解决:我实现的还只是扫面一个文件夹里的存储过程,这样如果存储过程被分放到几个文件夹,就需要执行几次,很不方便。如果有大神知道,怎么扫描子文件夹里的存储过程,请赐教!
嘿嘿!平时比较懒,很多东西想记录下来,却没有去做,只能写下这样比较省时间的啦!

 1 USE [xxxx]
 2 GO
 3 IF OBJECTPROPERTY(OBJECT_ID(N‘ExecDirPro‘), N‘IsProcedure‘) = 1
 4     DROP PROCEDURE dbo.ExecDirPro
 5 GO
 6 --------------------------------------------------------------------------------------------
 7 -- Name:            ExecDirPro
 8 -- Purpose:            出入目录,执行目录下所有sql脚本。注意传入的目录有中文时,前面加N
 9 -- Location:        Lottery
10 -- Excecution Example:    EXEC dbo.ExecDirPro
11 -- Authorized to:
12 --
13 -- Author:                clq
14 -- Create date:            2014-6-26
15 -- Alter:
16 --------------------------------------------------------------------------------------------
17 CREATE PROCEDURE [dbo].[ExecDirPro]
18     @dirPath nvarchar(200)
19 AS
20 begin try
21     --开启xp_cmdshell,完成以后关闭。保持开启很危险
22     EXEC sp_configure ‘show advanced options‘, 1;RECONFIGURE;EXEC sp_configure ‘xp_cmdshell‘, 1;RECONFIGURE;
23     CREATE TABLE #T([filename] nvarchar(1024));
24
25     declare @path nvarchar(300)
26     set @path=‘dir ‘+@dirPath+‘ /b‘
27
28     INSERT #T EXEC xp_cmdshell @path
29
30     DELETE #T WHERE [filename] IS NULL;
31
32     DECLARE @FILENAME NVARCHAR(1024);
33
34     DECLARE cur CURSOR FOR SELECT [filename] FROM #T order by [filename];
35
36     OPEN cur;
37
38     DECLARE @sql NVARCHAR(1000);
39     FETCH NEXT FROM cur INTO @FILENAME;
40
41     WHILE @@FETCH_STATUS=0
42         BEGIN
43            SET @sql=N‘sqlcmd -E -i ‘+@dirPath+@FILENAME;
44            EXEC xp_cmdshell @sql;
45            FETCH NEXT FROM cur INTO @FILENAME;
46         END
47     CLOSE cur;
48     DEALLOCATE cur;
49     --关闭xp_cmdshell
50     EXEC sp_configure ‘show advanced options‘, 1;RECONFIGURE;
51     EXEC sp_configure ‘xp_cmdshell‘, 0;RECONFIGURE;
52 end try
53 BEGIN CATCH
54     --关闭xp_cmdshell
55     EXEC sp_configure ‘show advanced options‘, 1;RECONFIGURE;
56     EXEC sp_configure ‘xp_cmdshell‘, 0;RECONFIGURE;
57     SELECT ERROR_NUMBER() AS ErrorNumber;
58 END CATCH;
59 GO
60   

利用xp_cmdshell扩展,调用执行系统shell脚本。没错,开启xp_cmdshell之后,可以执行shell脚本,可以干很多坏事!嘿嘿!如果你的数据库权限被人拿到,并且有开启xp_cmdshell的权限,这是极其危险的!xp_cmdshell一直开着不关,更是要不得的!请一定记住,完毕以后关闭xp_cmdshell!

SQL扫描并执行文件夹里的sql脚本,布布扣,bubuko.com

时间: 2024-10-23 05:14:18

SQL扫描并执行文件夹里的sql脚本的相关文章

oracle 数据恢复,只有oradata文件夹里的文件,没有备份文件的数据库恢复,重装系统后,oracle 10g数据库恢复

格式化重装系统后,才想起来oracle 10g 数据库没有做备份,开始以为很麻烦,没想到数据库恢复的还挺顺利的 恢复方法: 1,把原来的数据库文件备份,(D:\oracle\product\10.2.0\oradata\gqxt),重新命名即可,我命名为gqxt_old,(否则装数据库的时候会提示sid已存在). 2,重新安装数据库到原来的路径(不安装到原来的路径也没关系,但是原来的数据库文件必须在原来的路径不能变,也就是oradata\gqxt所在的路径不能变),数据库的名字就是你要恢复的名字

su认证失败&文件夹里打开终端的方法&atom安装

很久没用笔记本上的ubuntu,用不顺手,比在公司调教了半年多的电脑差远了.一步一步来.先解决最不顺手的三件事 1.su认证失败. 新安装的ubuntu系统是无法切换到root账户的,得做一番修改 sudo passwd 密码: 输入新的UNIX密码: 确认密码: 这样就可以了 2.文件夹里打开终端 sudo apt-get install nautilus-open-terminal 然后nautilus -q重新加载文件管理器,或注销登陆即可生效. 3.安装atom编辑器 sudo add-

diff两个文件夹里的东西

diff --help -x, --exclude=PAT               exclude files that match PAT 排除某个类型的文件 -u, -U NUM, --unified[=NUM]   output NUM (default 3) lines of unified context 输入行好 -N, --new-file                  treat absent files as empty 如果某个文件只在一个地方有,就把这个文件当作不存

删除文件夹里的 .svn,

删除文件夹里的 .svn,cmd  进入相应目录  运行    for /r ./ %a in (./) do @if exist "%a/.svn" rd /s /q "%a/.svn"

将Temporary文件夹里的Logo文件转移到Logo文件夹

/// <summary> /// 将Temporary文件夹里的Logo文件转移到Logo文件夹 /// </summary> /// <param name="new_resume"></param> /// <returns></returns> private bool RemoveToLogo(Resume new_resume) { string destinationPath = new_resume

[SQL Server]一次执行资料夹内的.sql 指令码

原文:[SQL Server]一次执行资料夹内的.sql 指令码 初始资料库时,我们Developers们会准备很多.sql指令码来建立资料表.检视甚至初始资料,那麽要怎麽一次执行资料夹内的*.sql或是指定的几个.sql指令码? 来节省一点点初始化资料库的作业时间. 好在我们有MSDN使用sqlcmd 执行指令码的范例: sqlcmd -S myServer\instanceName -i C:\myScript.sql 如果只有几个,串成bat档或是powershell也很方便,但如果很多个

jq和js插件的各个文件夹里放置的内容

1. demo文件夹,存放各种实例. 2. dist文件夹,全称是distribution.在某些框架中,因为开发和发布的内容或者代码形式是不一样的(比如利用Grunt压缩等等),这时候就需要一个存放最终发布版本的代码,这就是dist文件夹的用处.dist文件夹里的localization文件夹是本地化/局部化文件夹,是提供语言更换的.一般中文是zh.js. 3. lib文件夹是静态数据连接库,一般放引入文件,这个目录里存放着系统最基本的动态链接共享库,几乎所有的应用程序都须要用到这些共享库.个

一个文件夹里放多少个文件合适?

FAT16文件系统  可以保存的文件体积最大值是 4 GB - 1 byte (2^32 bytes - 1 byte):  卷的最大体积是4GB:每个卷上最多可以保存的文件数量是65,536个 (2^16):  根目录下可以保存的文件和文件夹数量最大值是512个(如果使用了长文件名,该数字还会减小) FAT32文件系统  可以保存的文件体积最大值是 4 GB - 1 byte (2^32 bytes - 1byte):  Windows自带的工具可以创建的卷的最大体积是32GB:  每个卷中最

利用python找出两文件夹里相同的文件并保存在新的文件夹下(分三种情况)

原文件夹A,B,新文件夹C,下图中的情况以图片为例 A:00001.jpg  00002.jpg   00003.jpg  00147.jpg B : 00001.jpg  000000002.jpg   00147.json 第一种情况:找出两文件夹下相同内容的文件,保存并输出到文件夹C 思路:判断内容是否一致,因此需要读取整个文件,判断两者是否一样 由于文件内容错综复杂,而其md5是唯一的,如果两者内容一致,则两者的md5值应该为一样.由于图片是二进制存储,在读取时采用'rb'.这里是对文件