2.9SqlCmd命令行工具程序
来源:优易学  2009-12-4 20:37:33   【优易学:中国教育考试门户网】   资料下载   IT书店
文章页内部300*250广告位

 

另外,SqlCmd 支持 T-SQL 语法文件包容变量,让你可以有弹性地重复使用 T-SQL 语法文件,这是以往 osql 工具程序办不到的。在 T-SQL 语法文件中可以下述的格式定义变量:

$(变量名称)

我们写一段简单的 T-SQL 语法如下,其中定义了两个变量 colname 和 tabname:

USE Northwind

SELECT $(colname)

FROM $(tabname)

另外用 Windows 命令底层(Command Shell)的指令语法编写批次文件来测试,范例程序代码2-4所示:

程序代码列表 2-4 通过底层的指令语法编写批次文件测试 SqlCmd 工具程序

@ECHO OFF

CLS

@ECH通过以下的 SqlCmd 选项执行

@ECHO i 输入 sql 文件名

@ECHO o 输出结果文件名

@ECHO 设置参数内容

@ECHO E 综合式验证登录

@ECHO 设置服务实例

@ECHO __________________________________________________

IF DEFINED Instance GOTO Instance

@ECHO ------------连接到本机默认实例--------------

@ECHO sqlcmd -isqlcmd.sql -oCustomers.log -vcolname=“CompanyName,ContactName” tabname=“Customers” -E

sqlcmd -isqlcmd.sql -oCustomers.log -vcolname=“CompanyName,ContactName” tabname=“Customers” -E

@ECHO ERRORLEVEL: %ERRORLEVEL%

PAUSE

@ECHO __________________________________________________

@ECHO --------------------用环境变量--------------------

@ECHO SET colname=*

@ECHO SET tabname=Orders

@ECHO sqlcmd -i sqlcmd.sql -oOrders.log -E

SET colname=*

SET tabname=Orders

sqlcmd -i sqlcmd.sql -oOrders.log -E

@ECHO ERRORLEVEL: %ERRORLEVEL%

GOTO End

:Instance


@ECHO --------------连接到指定实例:%Instance%--------------

@ECHO sqlcmd -S%Instance% -isqlcmd.sql -oCustomers.log -vcolname=“CompanyName,ContactName” tabname=“Customers” -E

sqlcmd -S%Instance% -isqlcmd.sql -oCustomers.log -vcolname=“CompanyName,ContactName” tabname=“Customers” -E

@ECHO ERRORLEVEL: %ERRORLEVEL%

PAUSE

@ECHO __________________________________________________

@ECHO --------------------用环境变量--------------------

@ECHO SET colname=*

@ECHO SET tabname=Orders

@ECHO sqlcmd -S%Instance% -i sqlcmd.sql -oOrders.log -E

SET colname=*

SET tabname=Orders

sqlcmd -S%Instance% -i sqlcmd.sql -oOrders.log -E

@ECHO ERRORLEVEL: %ERRORLEVEL%

:End

@ECHO 执行完毕

PAUSE

在范例中一开始便利用底层指令的 IF DEFINED 语法来测试我们自行定义的 Instance 环境变量是否存在,以决定程序逻辑的走向。

在范例中,通过 -i 菜单指定先前编写并保存的 T-SQL 指令文件 sqlcmd.sql,并以 -o 选项设置将执行结果输出至存放的文本文件。以 -E 选项设置登录验证的方式采用 Windows综合验证。由于笔者的机器上有两个 SQL Server 实例,因此再通过自行定义的 Instance 环境变量来决定连接的实例,若有定义 Instance 环境变量,则需要再利用 -S 选项设置连接的实例名称。

当然,整个范例中最大的特色是如何设置 T-SQL 指令文件中的变量部分,程序代码列2-4 分别列举了两种方式,一是通过 -v 选项搭配变量名称以及值的配对来设置,另一种是取与 T-SQL 指令文件中变量相同名称的系统环境变量,赋予值后直接调用 sqlcmd 装载该指令文件即可。

SqlCmd 程序执行完毕后,可以查看系统环境变量 ERRORLEVEL,若返回值为 0 代表执行结果无误,若值不等于 0,则代表有错误发生,程序代码列表2-4的执行结果如图2-32所示:


图2-32 程序代码列表2-4 的执行结果

由于笔者在程序代码列表2-4中使用了底层命令的 Pause,因此你在执行过程中会需要按下任意键后才会继续执行。执行完毕后,你可以通过 Notepad 工具程序打开 Customers.logOrders.log 两个普通文本文件,观察通过变量设置 T-SQL 语法内容的执行结果。

通过如上的批次执行方式,你可以在安装或维护日常 SQL Server 数据库时,周期地以后台的方式执行,而后查看执行记录来得知维护工作的结果。

最后,若你有兴趣看看被系统隐藏起来的对象,可以在任意的数据库内执行如下的语法:

select * from sys.objects where type='s'

将会发现一大堆系统数据表名称,其 schema 名称为 sys。但在一般的连接内,都无法看到这些数据表,若直接查询会得到如下的报错信息:

信息 208,级别 16,状态 1,行 1

无效的对象名称 'sys.sysfiles1'。

这时,你就可以通过 SqlCmd 工具程序搭配 -A 参数连接到 SQL Server 服务实例,便能够查看这些系统数据表。

另外,不晓得你是否注意到 SQL Server 服务实例启动时,所输出的 Log 会有一行如下的信息:

2005-12-23 14:05:52.75 spid5s Starting up database 'mssqlsystemresource'.

当你到存放数据库文件的目录下,默认的路径:

C:\Program Files\Microsoft SQL Server\MSSQL.n\MSSQL\Data

也会看到 mssqlsystemresource.mdf mssqlsystemresource.ldf 两个数据库文件。但在任何环境都看不到这个系统数据库,包括普通单纯的 SqlCmd -A 模式也不行。

SQL Server 2005 新增了一个存放系统对象的数据库,如系统视图表、存储过程等,其名称叫 mssqlsystemresource。由于系统对象统一放在这个数据库内,再对应给其他数据库使用,因此以后改版,上 Service Pack 时,只要换掉这个数据库即可。

若你有兴趣研究该数据库,可以先将 SQL Server 服务实例停止执行,而后复制mssqlsystemresource.mdfmssqlsystemresource.ldf 两个数据库文件。在此,笔者分别命名为 Copy_Resource.mdfCopy_Resource.ldf,而后重新启动 SQL Server 服务实例,并通过如程序代码列表2-5的 T-SQL 语法将该复制的数据库文件附加成另一个数据库,以后就可以研究其内部了 J

程序代码列表2-5 附加资源数据库以供研究各种系统对象的设计方式

DECLARE @path NVARCHAR(200),@mdf NVARCHAR(200),@ldf NVARCHAR(200)

SELECT @path=REPLACE(filename,'master.mdf','') FROM sys.sysfiles WHERE fileid=1

SET @mdf=@path + N'Copy_Resource.mdf'

SET @ldf=@path + N'Copy_Resource.ldf'

EXEC sp_attach_db 'CopyResource',@mdf,@ldf

 

上一页  [1] [2] 

责任编辑:小草

收藏此页】【 】【打印】【回到顶部
计算机文章页底部500*200广告
文章搜索:
 相关文章
计算机底部580*90广告
文章页右侧第一330*280广告
计算机文章页资讯推荐
热点资讯
文章页330尺寸谷歌广告位
热门课程培训