在非SQL客户端使用命令行方式定期连接SQL Server 服务器并模拟用户查询操作,同时输出信息内容

一个很长的标题,实现的功能就是尽量使用非人力的方式模拟人去做一件事情,为了便于记录,将他们输出成文件方便查阅。

图形界面方式,使用微软自己的ConnMaker.exe,或者Microsoft 数据连接(系统自带,建立一个后缀为.udl的文件即可体验),进行可视化的操作。

在非SQL客户端使用命令行方式定期连接SQL Server 服务器并模拟用户查询操作,同时输出信息内容

Figure 1使用ConnMaker.exe创建的可视化连接查询实例

不过这次用户的需求是因为他们在尝试进行连接到SQL服务器集群的时候仅仅是他的那个实例会偶尔出现连接失败的问题,为了验证是外网环境而非集群本身的问题,我们需要建立一个类似的环境(非本机的异机客户端连接)去模拟并记录这些事情。

这时候使用图形化界面可能太过于直观,所以本次操作使用命令行方式进行连接,测试,并输出。

同其他数据库软件提供商类似,微软也提供了基于命令行方式的连接,在安装有SQL Server服务器的环境下可以直接使用SQLPS这个命令来进行命令行操作,而对于题目要求的非SQL客户端环境下我们同样也有对策,使用SQLCMD即可。

软件很小巧,可以直接从微软的网站上下载获取,Microsoft® Command Line Utilities 11 for SQL Server®是SQLCMD对应的产品名称。如果出现安装失败,请先安装对应的新版ODBC驱动:Microsoft® ODBC Driver 11 for SQL Server® - Windows然后在尝试安装SQLCMD即可,请注意,软件有32位与64位之分,请根据自己的机器进行下载。

关于SQLCMD的更详细使用说明可以参考MSDN的官方支持:使用 sqlcmd 实用工具

本实例中使用到了利用系统自身验证(Integrated Security)连接数据,并在指定数据库的特定表内查询,返回一些查询结果,用这个结果来判断是否连接中断,以及是否完成正常查询。

设置任务计划,编写批处理,每天每小时延时一个随机时间(0~59秒)执行,输出后查看结果。

在非SQL客户端使用命令行方式定期连接SQL Server 服务器并模拟用户查询操作,同时输出信息内容

Figure 2在这里进行设置任务计划的随机延迟与间隔时间

##最小化执行脚本##

@echo off 

if "%1"=="h" goto begin 

start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",)(window.close)&&exit 

:begin 

##设置日期时间##

set ntime=%TIME: =%

set stamp=%date:~,%%date:~,%%date:~,%%ntime:~,%%ntime:~,%

set sq=%time:~,%

##输出生成T-SQL脚本语句,依据秒随机生成一个需要返回的行数,并在总输出前加1确保好识别##

@echo  SELECT TOP %sq% [AreaId] >%~dp0\%stamp%.sql

@echo       ,[AreaName] >>%~dp0\%stamp%.sql

@echo      ,[number_ps] >>%~dp0\%stamp%.sql

@echo   FROM [SXSystemSTS].[dbo].[Area] >>%~dp0\%stamp%.sql

##执行sqlcmd,并输出查询内容##

sqlcmd -S 10.5.70.50\ypcgzx -I -i "%~dp0%stamp%.sql" -o "%~dp0ypcgzx%stamp%.1%sq%.txt"

##删除过往的t-sql脚本语句##

del /F /Q %~dp0*.sql

上面是批处理命令,最终的输出效果是每到定时的时间执行一次,并输出成txt文本进行方便查阅。

在非SQL客户端使用命令行方式定期连接SQL Server 服务器并模拟用户查询操作,同时输出信息内容

Figure 3检查是否有出错信息可以仅查看文件大小为1KB的文件即可

在非SQL客户端使用命令行方式定期连接SQL Server 服务器并模拟用户查询操作,同时输出信息内容

Figure 4如果出现连接错误,会生成这三行错误记录,而对应的文件大小约等于1KB,因此这样可以减少排查范围

在制作脚本的过程中遇到了一个小问题就是来自于系统的time命令,有意思的是当他输出时间,且在的小时的时候1~9不会输出成01~09,因此给脚本带来了一些不便:

在非SQL客户端使用命令行方式定期连接SQL Server 服务器并模拟用户查询操作,同时输出信息内容

Figure 5因为生成的文件名中间有空格,而不能被sqlcmd所识别,即便是引号也是无济于事

因此需要自己定义一个新的函数ntime,具体操作见上面的批处理内容。

在非SQL客户端使用命令行方式定期连接SQL Server 服务器并模拟用户查询操作,同时输出信息内容

Figure 6系统自带time命令被改造成可以进行双位数显示的小时

希望上面的一些总结能帮助大家进行更好的自动化任务。

部分信息来自于:http://www.larmib.com/2011/dos-command-to-get-the-2-digit-hour-minute-and-second/http://msdn.microsoft.com/zh-cn/library/ms180944.aspxhttp://technet.microsoft.com/zh-cn/library/cc748841(v=ws.10).aspx

-=EOB=-

上一篇:Hi3559AV100-自己编译了u-boot、kernel及rootfs后,出现烧写错误或者烧写后板载无法启动的解决思路


下一篇:perl 函数参数传递与返回值(一)